0

你如何在java中使用反射找到集合的大小(即aSet或)?List

我有类似下面的示例,我想知道在使用反射时如何找到集合的大小。

编辑:

Class<?> clazz = node.getClass();
Field [] fields = clazz.getDeclaredFields();

for(Field field : fields) {
    System.out.println("declared fields:   "+ field.getType().getCanonicalName());

    //getting a generic type of a collection
    Type returntype = field.getGenericType();
    if (returntype instanceof ParameterizedType) {
        ParameterizedType type = (ParameterizedType) returntype;
        Type[] typeArguments = type.getActualTypeArguments();
        for(Type typeArgument : typeArguments) {
           Class<?> classType = (Class<?>) typeArgument;
           System.out.println("typeArgClass = " + classType.getCanonicalName());
        }
    }
}
4

3 回答 3

2

假设node是集合实例。

int size;
try { 
  size = (Integer) node.getClass().getMethod("size").invoke(node);
} catch (Exception e) {
  e.printStackTrace();
}

但是,当您可以调用时,通过反射来执行此操作没有多大意义node.size()

于 2012-06-20T21:36:32.810 回答
0

我不确定您所说的使用反射是什么意思。所有实现该java.util.Collection接口的类都具有size()为您提供集合大小的方法。

于 2012-06-20T21:37:55.600 回答
0

场景将实现一个通用类,它为您提供对象字段的简要摘要,对于集合实例,您只想吐出大小。我个人需要它来比较相同类型的两个对象(o1 和 o2)上的某些字段。我想知道集合实例是否已更改。

Field f1 = null;

   try {
f1 = o1.getClass().getDeclaredField(field);
   }
...

if (Collection.class.isAssignableFrom(f1.getType())) { // Making sure it is of type Collection
   int v1Size = Collection.class.cast(v1).size();   //  This is what you need
于 2013-07-17T10:17:34.980 回答