使用反射获取内部类字段值

时间:2017-05-30 11:03:37

标签: java reflection inner-classes

我正在尝试使用反射访问内部类字段值。

假设这些类是: -

public class OuterClass  {
    int a;
    public class InnerClass {
        int b;
        InnerClass(int b){
            this.b = b;
       }
    }

    public void setInnerField(int val){
        InnerClass a = new InnerClass(val);
    }
}

主要功能有: -

OuterClass obj = new OuterClass();
obj.a = 10;
obj.setInnerField(5);

以下是我试图获得内部类字段值,即b 参考How i can access inner class variable value using reflection in java?

Class[] classes = obj.getClass().getDeclaredClasses();     
for(Class innerClass: classes){
    //System.out.println(innerClass.getName());
    Field[] fields = innerClass.getDeclaredFields();
    for(Field field : fields){
        //System.out.println(field.getName());
        System.out.println(field.get(obj));  //<-----IllegalArgumentException    
//Tried with below line too as suggested in above link                                                                     
System.out.println(field.get(innerClass.getInterfaces())); //<-----IllegalArgumentException
    }           
}

那么在运行时访问内部类字段值的方法是什么?

1 个答案:

答案 0 :(得分:0)

您的代码抛出IllegalArgumentException,因为:

`System.out.println(field.get(obj));
 System.out.println(field.get(innerClass.getInterfaces()));// your inner class does not implement any interfaces which result in [] as an arg`

你传递给get方法的obj arg必须是声明你调用的字段的相同类型,在这种情况下是OuterClass $ InnerClass。 b

已经记录了get方法:

  

如果指定的对象不是声明基础字段的类或接口的实例,则该方法抛出IllegalArgumentException。

要么将您的内部类及其字段声明为静态,要么您拥有内部类的实例,并将其作为arg传递给field.get( innerInstance )在内部类字段上调用它