我正在向 Jasper 传递一个参数,它是一个 map 集合。我想使用这个集合作为表的数据集。
如果我有一个普通 Java 对象的集合,我会这样做:
$F{description}
获取字段。我想做这样的事情:
get(description)
或
values().get(1)
是否可以在这样的表中检索 map 值?
最佳答案
由于我确实想保持服务通用,所以我决定使用 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/