在Java中,只要创建了内部类实例,它就与外部类的实例相关联。出于好奇,是否可以将内部类与外部类的另一个实例相关联?
最佳答案
是的,这是可能的,尽管对我来说这听起来似乎是个坏主意。这个想法是使用反射(否则不能保证成功)将否则final
指针设置为外部实例。
import java.lang.reflect.*;
public class Me {
final String name;
Me(String name) {
this.name = name;
}
class InnerMe {
String whoAreYou() {
return name;
}
}
InnerMe innerSelf() {
return new InnerMe();
}
public static void main(String args[]) throws Exception {
final Me me = new Me("Just the old me!");
final InnerMe innerMe = me.innerSelf();
System.out.println(innerMe.whoAreYou()); // "Just the old me!"
Field outerThis = innerMe.getClass().getDeclaredFields()[0];
outerThis.setAccessible(true);
outerThis.set(innerMe, new Me("New and improved me!"));
System.out.println(innerMe.whoAreYou()); // "New and improved me!"
}
}
这里的关键部分是
outerThis.setAccessible(true);
- SecurityManager可能会强制执行一项禁止此操作成功的策略。