我正在向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/