Java 尝试使用反射获取对字段的引用时发生IllegalArgumentException

Java 尝试使用反射获取对字段的引用时发生IllegalArgumentException,java,reflection,illegalargumentexception,Java,Reflection,Illegalargumentexception,我正试图用相同的代码遍历许多自定义类的ArrayList,我认为使用反射会更容易。然而,当我试图获得每个字段的引用时,我遇到了一个问题。下面是我试图运行的代码的一个小表示。(我的代码有所不同,但要点如下): import java.lang.reflect.*; 导入java.util.ArrayList; 公共类堆栈{ 公共ArrayList cust11; 公共ArrayList cust12; 公共ArrayList cust13; 公共ArrayList cust21; 公共ArrayL

我正试图用相同的代码遍历许多自定义类的ArrayList,我认为使用反射会更容易。然而,当我试图获得每个字段的引用时,我遇到了一个问题。下面是我试图运行的代码的一个小表示。(我的代码有所不同,但要点如下):

import java.lang.reflect.*;
导入java.util.ArrayList;
公共类堆栈{
公共ArrayList cust11;
公共ArrayList cust12;
公共ArrayList cust13;
公共ArrayList cust21;
公共ArrayList cust22;
公共ArrayList cust23;
公共静态void main(字符串参数[]){
堆栈=新堆栈();
}
公共堆栈(){
cust11=新的ArrayList();
cust12=新的ArrayList();
cust13=新的ArrayList();
cust21=新的ArrayList();
cust22=新的ArrayList();
cust23=新的ArrayList();
doReflect();
}
公共无效数据引用(){
Field[]fields=this.getClass().getFields();
用于(字段f:字段){
如果(f.getName()包含(“cust1”)){
试一试{
ArrayList temp=(ArrayList)f.get(cust11);
}捕获(IllegalArgumentException | IllegalAccessException e){
e、 printStackTrace();
}
}
}
}
}
类客户1{
公共Custom1(){}
}
类别2{
公共Custom2(){}
}
当它到达

ArrayList<Custom1> temp = (ArrayList<Custom1>)f.get(cust11);
arraylisttemp=(ArrayList)f.get(cust11);
我明白了

java.lang.IllegalArgumentException:无法设置java.util.ArrayList字段
Stack.cust11到java.util.ArrayList
在sun.reflect.UnsafeFieldAccessorImpl.ThrowSetileGalargumentException处(未知源)
在sun.reflect.UnsafeFieldAccessorImpl.ThrowSetileGalargumentException处(未知源)
在sun.reflect.UnsafeFieldAccessorImpl.ensureObj(未知源)
位于sun.reflect.UnsafeObjectFieldAccessorImpl.get(未知源)
位于java.lang.reflect.Field.get(未知源)
在Stack.doReflect(Stack.java:33)
堆栈处。(Stack.java:25)
在Stack.main(Stack.java:14)
我该怎么做呢?

我应该用

ArrayList<Custom1> temp = (ArrayList<Custom1>)f.get(this);
arraylisttemp=(ArrayList)f.get(this);

您正在迭代类
堆栈的字段(
this.getClass().getFields()
),但为
字段.get
方法提供了一个
ArrayList
实例(
cust11
)。也许你是想打电话给f.get(这个)
?谢谢。这就是我错过的你的假设是错误的。反思并不能让这变得更容易。这样做效率低,而且容易出错。请记住,
Class.getFields()
返回的字段顺序是不保证的。如前所述:“返回数组中的元素没有排序,也没有任何特定的顺序”,在我的例子中,我不关心效率。我只是不想让8个for循环做同样的事情,但是使用不同的变量。反射缩短了我的代码,这正是我所关心的。此外,我在遍历字段名时会对其进行过滤,以避免顺序混乱
java.lang.IllegalArgumentException: Can not set java.util.ArrayList field 
Stack.cust11 to java.util.ArrayList
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(Unknown Source)
at java.lang.reflect.Field.get(Unknown Source)
at Stack.doReflect(Stack.java:33)
at Stack.<init>(Stack.java:25)
at Stack.main(Stack.java:14)
ArrayList<Custom1> temp = (ArrayList<Custom1>)f.get(this);