我有类似的东西:
Field [] fields = claz.getDeclaredFields();
for(Field f : fields){
f.setAccessible(true);
if(f.getType().equals(List.class)){
Method m = f.getType().getMethod("size");
int length = (Integer)m.invoke(f.get(node));
System.out.println("length "+ length);
}
}
它确实有效,但我想知道是否还有其他好的方法,比如适用于所有其他集合的东西(TreeSet,HashSet等等),或者唯一的方法是,我必须像我已经拥有的一样检查每种类型吗?
感谢
答案 0 :(得分:2)
您是否考虑过检查类型是否实现了Map或Collection接口?
答案 1 :(得分:2)
在Field
对象中,您可以检索“类型”并将其作为isAssignableFrom
的方法Collection.class
的参数传递。
像:
...
boolean isCollection = Collection.class.isAssignableFrom(f.getType())
...
从文档方法isAssignableFrom
:
确定此Class对象所表示的类或接口 与...相同或者是超类或超级接口 由指定的Class参数表示的类或接口。它 如果是,则返回true;否则返回false。如果是这个Class对象 表示基本类型,如果指定,此方法返回true Class参数正是这个Class对象;否则它会返回 假的。
同样应该使用Map
:
boolean isMap = Map.class.isAssignableFrom(f.getType());
答案 2 :(得分:0)
Collection.class.isAssignableFrom(f.getType())
适用于所有集合类型 - 列表和集合的所有实现。
Maps
必须单独检查,因为它们没有实现Collection
接口。