Java反射 - 访问字段的字段

时间:2017-02-20 06:56:19

标签: java reflection

我试图了解反射如何与嵌套对象一起使用:

这是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解析为类型

参见附图。 enter image description here

任何指针或帮助都将受到高度赞赏。

更新:

我找到了解决方案:

  for (Field field : fields) {
           if(field.getType().getTypeName().equalsIgnoreCase("java.util.List")){
                  ParameterizedType impl=(ParameterizedType) field .getGenericType();
                  String nameOfClass=impl.getActualTypeArguments()[0].getTypeName();
           }

感谢您的帮助。

1 个答案:

答案 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());}

       }