【发布时间】: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