从内部类对象中获取外部类对象
我有以下代码。 我想要获得使用我创build内部类对象inner
的外部类对象。 我该怎么做?
public class OuterClass { public class InnerClass { private String name = "Peakit"; } public static void main(String[] args) { OuterClass outer = new OuterClass(); InnerClass inner = outer.new InnerClass(); // How to get the same outer object which created the inner object back? OuterClass anotherOuter = ?? ; if(anotherOuter == outer) { System.out.println("Was able to reach out to the outer object via inner !!"); } else { System.out.println("No luck :-( "); } } }
编辑:好吧,你们中的一些人build议通过添加一个方法来修改内部类:
public OuterClass outer() { return OuterClass.this; }
但是如果我没有控制权来修改内部类,那么(只是为了确认)我们是否有其他方法从内部类对象中获取相应的外部类对象呢?
在内部类本身中,可以使用OuterClass.this
。
我不认为有办法从内部类的代码之外获得实例。 当然,你可以随时介绍你自己的财产:
public OuterClass getOuter() { return OuterClass.this; }
编辑:通过实验,它看起来像持有引用外部类的字段具有包级别访问 – 至less与我正在使用的JDK。
编辑:使用的名称( this$0
)实际上在Java中有效,但JLS不鼓励它的使用:
$
字符只能用于机械生成的源代码,或者很less用于访问原有系统上的预先存在的名称。
OuterClass.this
引用外部类。
你可以(但你不应该)使用reflection的工作:
import java.lang.reflect.Field; public class Outer { public class Inner { } public static void main(String[] args) throws Exception { // Create the inner instance Inner inner = new Outer().new Inner(); // Get the implicit reference from the inner to the outer instance // ... make it accessible, as it has default visibility Field field = Inner.class.getDeclaredField("this$0"); field.setAccessible(true); // Dereference and cast it Outer outer = (Outer) field.get(inner); System.out.println(outer); } }
当然,隐含引用的名字是完全不可靠的,所以我说,你不应该:-)
我认为这可能是滥用内部类的使用。 在我看来,你想要做的是违反了面向对象编程的基本概念。 如果您想从内部类访问外部类,请包含对外部类的引用,以便您可以访问它。 当你必须做这样棘手的事情,通常是一个迹象,你应该重新考虑你的deviseselect。
这是一个例子:
// Test public void foo() { C c = new C(); A s; s = ((AB)c).get(); System.out.println(s.getR()); } // classes class C {} class A { public class B extends C{ A get() {return A.this;} } public String getR() { return "This is string"; } }
我只是这样做了:
public class CherryTree { public class Cherry { public final CherryTree cherryTree = CherryTree.this; // [...] } // [...] }
当然,你需要能够修改内部类,每个获得内部类对象的人现在都可以访问外部类对象。 在我的情况下,这很好。
如果你没有控制权来修改内部类,反馈可能会帮助你(但不推荐)。 这个$ 0是Inner类的引用,它告诉哪个Outer类的实例被用来创buildInner类的当前实例。
这个问题的更一般的答案涉及阴影variables以及它们如何被访问。
在以下示例中(来自Oracle), main()中的variablesx是阴影Test.x :
class Test { static int x = 1; public static void main(String[] args) { InnerClass innerClassInstance = new InnerClass() { public void printX() { System.out.print("x=" + x); System.out.println(", Test.this.x=" + Test.this.x); } } innerClassInstance.printX(); } public abstract static class InnerClass { int x = 0; public InnerClass() { } public abstract void printX(); } }
运行这个程序将打印:
x=0, Test.this.x=1
更多信息: http : //docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6