JDK6内部类中“this”的字段类型错误?

时间:2011-09-01 03:07:27

标签: 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());
    }
}

输出:

innerClassString   :::   class java.lang.String
innerClass   :::   class OuterClass$InnerClass
this$0   :::   class OuterClass

我希望这个$ 0是OuterClass.InnerClass类型。

这是一个Java错误吗?有没有办法解决这个意想不到的行为?

谢谢,

埃里克

2 个答案:

答案 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?