Eri*_* B. 0 java reflection field inner-classes
我在这里遇到了一个奇怪的结果,我不确定它是Java中的错误还是预期的行为.我有一个内部类,我使用反射来获取声明的字段(class.getDeclaredFields()).但是,当我循环遍历字段列表并检查各个类型时,"this"字段返回外部类而不是内部类.
这是预期的行为吗?这对我来说似乎很奇怪.
例如:
import java.lang.reflect.Field;
public class OuterClass {
public class InnerClass{
public String innerClassString;
public InnerClass innerClass;
}
public static void main(String[] args) {
// print the fields of the inner class
for( Field field : OuterClass.InnerClass.class.getDeclaredFields())
System.out.println( field.getName() + " ::: " + field.getType());
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
innerClassString ::: class java.lang.String
innerClass ::: class OuterClass$InnerClass
this$0 ::: class OuterClass
Run Code Online (Sandbox Code Playgroud)
我希望这个$ 0是OuterClass.InnerClass类型.
这是一个Java错误吗?反正有办法解决这个意想不到的行为吗?
谢谢,
埃里克
每个非静态内部类都维护一个不可见的ivar,它保存对实例化的外部类的引用.那是什么this$0
.
将InnerClass更改为public static class
并查看差异.
为清楚起见,Oracle建议使用以下术语:
http://download.oracle.com/javase/tutorial/java/javaOO/nested.html
术语:嵌套类分为两类:静态和非静态.声明为static的嵌套类简称为静态嵌套类.非静态嵌套类称为内部类.
...
InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访问其封闭实例的方法和字段....
要实例化内部类,必须首先实例化外部类.然后,使用以下语法在外部对象中创建内部对象:
Run Code Online (Sandbox Code Playgroud)OuterClass.InnerClass innerObject = outerObject.new InnerClass();
===
如果你愿意,是否可以从内部类中访问这个$ 0变量?
在内部类的方法中,您可以说:
OuterClass outer = OuterClass.this;
Run Code Online (Sandbox Code Playgroud)
要么
System.out.println(OuterClass.this.toString());
Run Code Online (Sandbox Code Playgroud)
这种特殊的变种这个 - OuterClass.this
-正在访问的this$0
伊娃-这将返回OuterClass
实例.请注意,这与使用方法this
内部的常规InnerClass
方法不同,后者将返回当前InnerClass
实例.
===
此外,如何在不使用字符串比较的情况下确定是否正在处理"this $ 0"字段?
我不清楚你要做什么,所以我不能推荐如何实现你想要的.