我有一个我想用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());
}
}
答案 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);
我记下了需要处理的异常,但忽略了异常处理细节,因为它使代码混乱。根据您的具体情况而有所不同 - 根据您的具体情况做最好的事情。
答案 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());
}