【问题标题】:Getting inner class field values using reflection使用反射获取内部类字段值
【发布时间】:2017-05-30 11:03:36
【问题描述】:

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

假设类是:-

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
    }           
}

那么在运行时访问内部类字段值的方法有哪些?

【问题讨论】:

  • 不确定您要做什么。但请注意,当您调用 setInnerField(5) 时,您正在创建一个 InnerClass 实例,但会立即将其丢弃。此时您没有任何InnerClass 类型的对象,因此您无法访问任何字段。
  • 你的内部类不是外部类的成员(外部类没有private InnerClass inner;字段),因此无法访问。
  • @matoni 严格来说,任何内部类都是其外部类的成员。也许您的意思是外部类中没有 field 是内部类的 instance
  • 它在filed.get(obj)中抛出非法arg异常,因为参数不是声明字段的类型,在get()方法的文档中:“如果指定的对象是不是声明基础字段的类或接口的实例,该方法会引发 IllegalArgumentException。“您将 OuterClass 类型的 obj 传递给它以获取字段 OuterClass$InnerClass.b 所以您要么拥有 InnerClass 的实例并将其传递给归档.get(innerObj) 或声明你的内部类和它的字段作为静态成员

标签: java reflection inner-classes


【解决方案1】:

您的代码抛出 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 必须与声明您调用 get 的字段的类型相同,在本例中为 OuterClass$InnerClass。b

这已经记录在 get 方法中:

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

要么你声明你的内部类和它的字段作为一个静态的,或者你有你的内部类的一个实例并将它作为一个 arg 传递给 field.get(innerInstance) 当你在内部类字段

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多