1

我有类似的东西:

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

谢谢

4

3 回答 3

2

您是否考虑过检查该类型是否实现了 Map 或 Collection 接口?

于 2012-06-25T19:46:55.693 回答
2

在一个Field对象中,您可以检索 Type 并将其作为参数传递isAssignableFromCollection.class.

像:

...
boolean isCollection = Collection.class.isAssignableFrom(f.getType())
...

从文档中获取方法isAssignableFrom

确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。如果是,则返回 true;否则返回false。如果此 Class 对象表示原始类型,则如果指定的 Class 参数正是此 Class 对象,则此方法返回 true;否则返回false。

也应该这样做Map

boolean isMap = Map.class.isAssignableFrom(f.getType());
于 2012-06-25T19:47:14.200 回答
0

Collection.class.isAssignableFrom(f.getType()) 将适用于所有集合类型 - 列表和集合的所有实现。

Maps但是,必须单独检查,因为它们不实现Collection接口。

于 2012-06-25T19:50:32.997 回答