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

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错误吗?反正有办法解决这个意想不到的行为吗?

谢谢,

埃里克

Ber*_*t F 9

每个非静态内部类都维护一个不可见的ivar,它保存对实例化的外部类的引用.那是什么this$0.

将InnerClass更改为public static class并查看差异.

为清楚起见,Oracle建议使用以下术语:

http://download.oracle.com/javase/tutorial/java/javaOO/nested.html

术语:嵌套类分为两类:静态和非静态.声明static的嵌套类简称为静态嵌套类.非静态嵌套类称为内部类.

...

InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访问其封闭实例的方法和字段....

要实例化内部类,必须首先实例化外部类.然后,使用以下语法在外部对象中创建内部对象:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();
Run Code Online (Sandbox Code Playgroud)

===

如果你愿意,是否可以从内部类中访问这个$ 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"字段?

我不清楚你要做什么,所以我不能推荐如何实现你想要的.