我试图了解反射如何与嵌套对象一起使用:
这是ClassA
public class ClassA {
Integer A;
Integer B;
List<ClassB> C;
public Integer getA() {
return A;
}
public void setA(Integer a) {
A = a;
}
public Integer getB() {
return B;
}
public void setB(Integer b) {
B = b;
}
public List<ClassB> getC() {
return C;
}
public void setC(List<ClassB> c) {
C = c;
}
}
ClassB的:
public class ClassB {
int a ;
int b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
}
我正试图访问这样的字段:
public static void main(String[] args){
ClassA classA=new ClassA();
Field[] fields =classA.getClass().getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}
}
问题:我想访问ClassB的字段,我正在尝试这样做:
fields[2].getType().getDeclaredFields();
但getType()返回接口java.util.List ,这是真的,但我的目标是ClassB的成员/字段
然后我试过:
fields[2].getGenericType()
返回java.util.List
在调试模式下,我可以看到它返回ParameterizedTypeImpl,但我没有声明并获取actualTypeArguments。
当我声明parameterizedTypeImpl。
时,它会以某种方式给出编译问题ParameterizedTypeImpl impl=fields[2].getGenericType();
无法将ParameterizedTypeImpl解析为类型
任何指针或帮助都将受到高度赞赏。
更新:
我找到了解决方案:
for (Field field : fields) {
if(field.getType().getTypeName().equalsIgnoreCase("java.util.List")){
ParameterizedType impl=(ParameterizedType) field .getGenericType();
String nameOfClass=impl.getActualTypeArguments()[0].getTypeName();
}
感谢您的帮助。
答案 0 :(得分:2)
ClassA classA=new ClassA();
Field[] fields =classA.getClass().getDeclaredFields();
for (Field field : fields) {
if (Collection.class.isAssignableFrom(field.getType())){
System.out.println(field.getName());//you can remove this as per requirement
Class<?> c1 = (Class<?>) ((((ParameterizedType) field.getGenericType()).getActualTypeArguments())[0]);
Field[] fieldsInner = c1.getDeclaredFields();
for (Field fieldInner : fieldsInner) {
System.out.println(fieldInner.getName());
}
else{
System.out.println(field.getName());}
}