2016-04-02 3 views
1

У меня есть класс, который я хочу проанализировать с помощью java.reflection. Я создал класс, у которого есть Arraylist другого объекта. Когда я хочу проанализировать класс, у которого есть ArrayList, класс реконструирован, но я не знаю, как получить размер Arraylist.получить размер arraylist от объекта используя отражение

Прилагаю код.

общественный класс Отдел { частных студентов ArrayList;

public Department() { 
    super(); 
    Students = new ArrayList<>(); 
} 
public Department(ArrayList<Student> students) { 
    super(); 
    Students = students; 
} 
public void addStudent(Student student){ 
    if(student != null){ 
     this.Students.add(student); 
    } 

} 
@Override 
public String toString() { 
    return "Class [Students=" + Students + "]"; 
} 


public static void analyze2(Object obj){ 
    Class c = obj.getClass(); 
    Field[] fieldType= c.getDeclaredFields(); 
    ArrayList<?> ob = new ArrayList<>(); 
    System.out.println(obj.toString()); 

     for(Field field : fieldType){ 
      Class cd = field.getType(); 
      ob = (ArrayList<?>) cd.cast(ob); 
      System.out.println(field.getName()+" "+ field.getType()); 
      System.out.println(ob.size()); 

     } 
    } 

ответ

0

Вы должны получить значение поля с помощью метода get и передать экземпляр Department объекта. Если поле имеет тип ArrayList, затем отдать результат в «ArrayList», а затем распечатать его размер.

for(Field field : fieldType){ 
     Class<?> cd = field.getType(); 
     Object fieldVal = field.get(ob); 
     if(fieldVal instanceof ArrayList){ 
     ArrayList<?> arrayListField = (ArrayList<?>)fieldVal; 
     System.out.println(arrayListField.size()); 
     } 
     System.out.println(field.getName()+" "+ field.getType()); 
    } 
+0

Спасибо! оно работает –

1

Если вы просто хотите получить & вызвать метод size посредством отражения без заливки объекта обратно ArrayList, вы можете использовать Method.invoke():

ArrayList<String> list = new ArrayList<>(); 
    list.add("A"); 
    list.add("B"); 

    Object obj = list; 
    Class noparams[] = {}; 
    Class cls = obj.getClass(); 

    // note may throw: NoSuchMethodException, SecurityException 
    Method method = cls.getDeclaredMethod("size", noparams); 
    method.setAccessible(true); 

    // note may throw: IllegalAccessException, IllegalArgumentException, InvocationTargetException 
    Object retObj = method.invoke(obj, (Object[]) null); 

    System.out.println(retObj); 

Я сделал пометку исключений, которые должны быть обработанные, но исключенные особенности обработки исключений, поскольку он загромождает код &, зависит от вашего конкретного контекста - сделайте то, что лучше для вашей ситуации.

Официальный учебник: method invocation via reflection.

Смежные вопросы