使用存储在变量中的嵌套类实例访问外部类实例?

时间:2014-03-11 16:15:58

标签: java nested-class

考虑以下课程:

public class A {
    public int a;

    public class B {
         public int b;

         public void foo() {
             System.out.println(A.this.a);
             System.out.println(this.b);
         }
    }
}

foo中,我使用语法AB内访问外部A.this实例。这很有效,因为我试图从"当前对象"中访问A的外部实例。在B。但是,如果我想从A类型的变量访问外部B对象,该怎么办?

public class A {
    public int a;

    public class B {
         public int b;

         public void foo(B other) {
             System.out.println(other.A.this.a); // <-- This is (obviously) wrong. What SHOULD I do here?
             System.out.println(other.b);
         }
    }
}

访问&#34;外部&#34;的正确语法是什么?来自&#34;内部&#34;的实例other中的实例foo

我意识到我只能使用a来访问外部变量other.a。请原谅人为的例子!我只是想不出更好的方式来询问如何到达other.A.this

2 个答案:

答案 0 :(得分:1)

据我所知,Java语言规范中,Java没有提供此类访问的语法。您可以通过提供自己的访问方法来解决它:

public class A {
    public int a;

    public class B {
         public int b;
         // Publish your own accessor
         A enclosing() {
             return A.this;
         }
         public void foo(B other) {
             System.out.println(other.enclosing().a);
             System.out.println(other.b);
         }
    }
}

答案 1 :(得分:1)

嗯,你不能直接这样做,因为Java语言中没有这样的方法。但是,您可以使用一些反射黑客来获取该字段的值。

基本上,内部类在名为this$0的字段中存储对封闭类的引用。您可以在this other post on SO中找到更多详细信息。

现在,使用反射,您可以访问该字段,并获取该字段的任何属性的值:

class A {
    public int a;

    public A(int a) { this.a = a; }

    public class B {
         public int b;

         public B(int b) { this.b = b; }

         public void foo(B other) throws Exception {
             A otherA = (A) getClass().getDeclaredField("this$0").get(other); 
             System.out.println(otherA.a);
             System.out.println(other.b);
         }
    }
}

public static void main (String [] args) throws Exception {
    A.B obj1 = new A(1).new B(1);
    A.B obj2 = new A(2).new B(2);
    obj2.foo(obj1);
}

这将打印1, 1

但正如我所说,这只是一个黑客。你不想在实际应用中编写这样的代码。相反,你应该采用更简洁的方式,如@ dashblinkenlight的答案所示。