在Java中,每当创建内部类实例时,它都会与外部类的实例关联。出于好奇,是否有可能将内部类与外部类的另一个实例相关联?可能在Java中更改内部类的外部类实例吗?
回答
是的,这是可能的,虽然这听起来像一个非常糟糕的主意给我。我们的想法是使用反射来设置指向外部实例的其他指针(不保证成功)。
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可以强制执行禁止这种得手的政策。
您应该可以使用反射。
刚刚得到内部类(getClass().getDeclaredFields()
)的各个领域,看看哪些字段保存父,然后改变它(使用field.set(innerInstance, newParent)
之前,你应该访问的领域 - setAccessible(true)
)
由于现场出现是final
,你可以看看this article看看如何绕过这个。
这就是说,你根本不需要这样做 - 这将是一个双倍丑陋的黑客没有实际收益。
如果你正在谈论实例化时,有可能使用的语法如下:
public class Outer {
public class Inner {}
}
...
Outer o = new Outer();
Outer.Inner i = o.new Inner();
但是,这是不可能的(不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);
}
(+1)与'final'相得益彰。 – Bozho 2010-03-02 23:55:09
+1 for'o.new Inner()' - 今天我学到了一种新的语法。 – 2012-03-02 22:17:24
- 1. 内部类引用外部类实例
- 2. 外部类内部类 - 实例化内部类作为外部类的成员
- 3. 是否可以从内部类实例访问一个外部类实例?
- 4. 删除内部类的实例在外部类的一个实例
- 5. 在Java中可能的内部类?
- 6. 的Java内部类阴影外部类
- 7. Java从内部类单例中访问外部类变量
- 8. 当提供内部类的实例时,找到外部类
- 9. 内部类可以从java中的外部类继承扩展吗?
- 10. 在类内部创建类的实例
- 11. 外部类可以调用其内部类的方法吗?
- 12. 您可以在Java applet中的Applet/JApplet类外部有类吗?
- 13. 内部类的实例化
- 14. 我可以使用内部类类型的反射来获得外部类的实例吗?
- 15. 如果在外部类的方法中声明内部类,如何初始化内部类的实例?
- 16. Java:内部类中的内部类
- 17. 更改外部类的VTable
- 18. Java单例内部类
- 19. Java:在匿名内部类中调用外部类方法
- 20. 在外部类中使用内部类对象java
- 21. Python的内部类可以是它自己的外部类的子类吗?
- 22. 如何更改外部类?
- 23. 访问外部类的实例在Java中
- 24. 如何从Python中的外部类更改内部类中的字段?
- 25. 我可以创建一个内部静态类的实例吗?
- 26. 可以SublimeJEDI自动完成自定义/外部类实例吗?
- 27. Java泛型类,使用外部类参数的内部类
- 28. 内部类和外部类在c#
- 29. 实例方法中的内部类
- 30. 抽象类实例化内部类
除了未来混淆java比赛中的潜力之外,还有什么意义呢?你知道,如果你想要一个内部类可以从它的父母解除关联,你可以声明它是静态的,对吧? – 2010-03-03 00:27:31
我觉得这个问题很有趣。有谁知道在JLS中指定了外部类的指针是如何命名的?通过实验,我发现它似乎是'this $ 0',根据需要附加了许多'$'(可能没有)。这实际上是指定的吗? – polygenelubricants 2010-03-03 00:33:49
好的,我刚刚发现第二层的内部类使用'this $ 1'来代替。迷人! – polygenelubricants 2010-03-03 00:37:23