2012-06-20 61 views
0

如何在Java中使用反射來查找Collection的大小(即SetList)?如何在java中使用反射來查找Collection的大小?

我有類似下面的例子,想知道如何在使用反射的時候找到集合的大小。

編輯:

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()); 
     } 
    } 
} 
+2

那麼,它會怎麼做*沒有*反射? (也就是說,反射與它有什麼關係......?) – 2012-06-20 21:34:03

+1

你能否提供一個你認爲「找到一個大小」是什麼的場景?是否像通過反射調用size()一樣簡單? – dasblinkenlight

+0

你能舉個簡單的例子嗎? – jsalonen

回答

2

假設node是集合實例。

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

沒有多大意義通過反射來做到這一點時,你只是可以調用node.size(),雖然。

+1

+1,因爲它*確實*回答了這個問題......它可能*在對象類型 - 或許多不同的無關類型 - 真的嗎?不管出於什麼原因),但仍然有一個'size()'方法(儘管如此,上述代碼仍然無效)。對於只有一個「關閉類型」,演員陣容就足夠了... – 2012-06-20 21:37:57

+1

修復了任何具有size方法返回整數的任何東西的代碼:) –

0

我不確定你使用反射意味着什麼。所有實現java.util.Collection接口的類都有size()方法,該方法可爲您提供集合的大小。

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 
相關問題