是的,这是可能的,虽然这对我来说听起来真是个糟糕的主意.我们的想法是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!"
}
}
Run Code Online (Sandbox Code Playgroud)
这里的关键部分是outerThis.setAccessible(true);- SecurityManager可以强制执行禁止成功的策略.
如果您正在谈论实例化时间,可以使用以下语法:
public class Outer {
public class Inner {}
}
...
Outer o = new Outer();
Outer.Inner i = o.new Inner();
Run Code Online (Sandbox Code Playgroud)
但是,不可能(不setAccessible(true))将内部类的现有实例与外部类的另一个实例相关联,因为指向封闭实例的字段是final:
javap Outer$Inner
Compiled from "Outer.java"
public class Outer$Inner extends java.lang.Object{
final Outer this$0;
public Outer$Inner(Outer);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
522 次 |
| 最近记录: |