如何使用反射确定字段类型是List(或任何其他类型的集合)?

时间:2012-06-25 19:43:00

标签: java reflection collections

我有类似的东西:

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等等),或者唯一的方法是,我必须像我已经拥有的一样检查每种类型吗?

感谢

3 个答案:

答案 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接口。