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

ca1c2owp  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(291)

考虑以下类别:

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 ,我访问外部 A 内部示例 B 使用语法 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);
         }
    }
}

从“内部”示例访问“外部”示例的正确语法是什么 otherfoo ?
我知道我可以访问外部变量 a 简单使用 other.a . 请原谅这个做作的例子!我只是想不出更好的方法来问你如何到达 other.A.this .

pkwftd7m

pkwftd7m1#

据我从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);
         }
    }
}
uqdfh47h

uqdfh47h2#

好吧,您不能直接这样做,因为java语言中没有定义这种方法。但是,您可以使用一些反射hack来获取该字段的值。
基本上,内部类在名为 this$0 . 你可以在这篇文章中找到更多的细节。
现在,使用反射,可以访问该字段,并获取该字段的任何属性的值:

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的答案中描述的更干净的方式去做。

相关问题