我正在向Jasper传递参数,该参数是Maps的集合。我想将此集合用作表的数据集。

如果我有一组普通的Java对象,我会做:

$F{description}


获得领域。我想做类似的事情:

get(description)


要么

values().get(1)


是否可以在这样的表中检索映射值?

最佳答案

因为我真的想保持服务的通用性,所以我决定使用Javassist创建动态类。这是一个丑陋的解决方案,但至少可以奏效。

    HashMap<String, Object> element = (HashMap<String, Object>) ((ArrayCollection) v).get(0);
    ClassPool pool = ClassPool.getDefault();
    CtClass ctClass = pool.makeClass("Dynamic"+System.currentTimeMillis());
    element.keySet().forEach(s -> {
    try {
    //need only Strings
    ctClass.addField(CtField.make("public String "+s+";", ctClass));
    ctClass.addMethod(CtMethod.make("public String get" + StringUtils.capitalize(s) + "() { return " + s + "; }", ctClass));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                });
    Class clazz = ctClass.toClass();
    ArrayList<Object> objects = new ArrayList<>();
    ((Collection) v).forEach(m -> {
        HashMap<String, Object> hm = (HashMap<String, Object>) m;
        try {
            Object obj = clazz.newInstance();
            element.keySet().forEach(s -> {
                try {
                    obj.getClass().getDeclaredField(s).set(obj, hm.get(s));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        objects.add(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
    });
    parameters.put(k, new JRBeanCollectionDataSource(objects));

关于java - 如何在JasperReports中将 map 用作数据集元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27402463/

10-11 02:07