本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:如何从内部类对象获取外部类对象
我有以下代码。我想掌握使用外部类对象创建内部类对象的方法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 :-( ");
}
}
}
你们中的一些人建议通过添加方法来修改内部类
public OuterClass outer() {
return OuterClass.this;
}
如果我没有控制权来修改内部类,我们还有其他方法可以从内部类对象中获取相应的外部类对象吗?
回答1:
您可以(但不应该)使用反射:
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);
}
}
当然,隐式引用的名称是绝对不可靠的,因此正如我所说,您可以但您不应该
回答2:
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