2016-11-15 5 views
0

У меня есть класс (с суперклассом), для которого я хочу проверить, что все поля либо NULL, либо если это коллекция, то она пуста. С помощью следующего кода я могу проверить NULL и является ли это коллекция, но я не могу бросить коллекции, чтобы проверить его размер:Reflection - унаследованные поля все пустые или пустые

public static boolean objectIsEmpty(Object object) { 
    for (Class<?> c = object.getClass(); c != null; c = c.getSuperclass()) { 
     Field[] fields = c.getDeclaredFields(); 
     for (Field field : fields) { 
      field.setAccessible(true); 
      try { 
       if (field.get(object) != null) { 
        if (field.getType().equals(List.class)) { 
         // System.err.println("len " + 
         // Array.getLength(field.get(object))); 
        } 
        if (Collection.class.isAssignableFrom(field.getType())) { 
         System.err.println(Collection.class.cast(field).size()); 
         // ClassCastException thrown here 
        } 
       } 
      } catch (IllegalAccessException e) { 
       // Should not occur with setAccessible(true), return false just 
       // in case 
       e.printStackTrace(); 
       return false; 
      } 
     } 
    } 
    return true; 

Но это приводит к java.lang.ClassCastException: Не удается cast java.lang.reflect.Field to java.util.Collection

Как получить размер списков?

ответ

4

Вы не можете отличить поле в свою коллекцию. Вы можете передать объект поля в коллекцию. Попробуйте следующее:

System.err.println(Collection.class.cast(field.get(object)).size()); 
+0

О, боже, конечно. В настоящее время я думаю об этом, спасибо за быстрый ответ! – CounterFlame

+0

Добро пожаловать :) –