我在这里遇到了一个奇怪的结果,我不确定它是否是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());
}
}
输出:
innerClassString ::: class java.lang.String
innerClass ::: class OuterClass$InnerClass
this$0 ::: class OuterClass
我希望这个$ 0是OuterClass.InnerClass类型。
这是一个Java错误吗?有没有办法解决这个意想不到的行为?
谢谢,
埃里克
答案 0 :(得分:9)
每个非静态内部类都维护着一个不可见的ivar,它包含对它实例化的外部类的引用。那就是this$0
。
将InnerClass更改为public static class
并查看差异。
为清楚起见,Oracle建议使用以下术语:
http://download.oracle.com/javase/tutorial/java/javaOO/nested.html
术语:嵌套类分为两类:静态和非静态。 声明为静态的嵌套类简称为静态嵌套类。 非静态嵌套类称为内部类。
...
InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访问其封闭实例的方法和字段。 ...
要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
===
如果需要,是否可以从内部类中访问此$ 0变量?
在内部类的方法中,您可以说:
OuterClass outer = OuterClass.this;
或
System.out.println(OuterClass.this.toString());
这个此 - OuterClass.this
的特殊变体 - 正在访问this$0
ivar - 它将返回OuterClass
个实例。请注意,这与使用this
方法中的常规InnerClass
不同,后者将返回当前的InnerClass
实例。
===
此外,如何在不使用字符串比较的情况下确定是否正在处理“this $ 0”字段?
我不清楚你要做什么,所以我不能推荐如何达到你想要的效果。
答案 1 :(得分:0)
此$ 0是Inner类中的引用,它指示使用哪个Outer类实例来创建Inner类的当前实例。
更多细节可以看到这个问题。
What does it mean if a variable has the name "this$0" in IntelliJ IDEA while debugging Java?