使用反射从对象获取arraylist大小

时间:2016-04-02 14:02:51

标签: java reflection

我有一个我想用java.reflection分析的类。 我创建了一个具有其他对象的Arraylist的类。 当我想分析具有ArrayList的类时,该类被重新识别但我不知道如何获得Arraylist大小。

我附上了代码。

公共类部门{     private 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());

      }
    }

2 个答案:

答案 0 :(得分:1)

如果你只想得到&amp;通过反射调用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

答案 1 :(得分: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());
  }