在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. 在Java中可能的内部类?
- 4. Java从内部类单例中访问外部类变量
- 5. 内部类的实例化
- 6. 您可以在Java applet中的Applet/JApplet类外部有类吗?
- 7. Java:内部类中的内部类
- 8. Java单例内部类
- 9. Java:在匿名内部类中调用外部类方法
- 10. Python的内部类可以是它自己的外部类的子类吗?
- 11. 如何更改外部类?
- 12. 内部类和外部类在c#
- 13. 如何获得也在内部类中的内部类的外部类
- 14. 内部类的实例无法访问外部类的数据成员
- 15. 通过外部类的实例访问一个嵌套的内部类
- 16. 访问外部类的内部类
- 17. 的Java内部类
- 18. 内部类访问外部类成员
- 19. Qt C++内部类访问外部类
- 20. 爪哇 - 内部的内部类阵列外部类
- 21. 如何用Java中的反射获取pirvate内部类实例?
- 22. 我可以在蜂巢中将表格从内部更改为外部吗?
- 23. Java中的内部类
- 24. 在类外部实例化私有构造的类
- 25. 在Java中没有使用外部类的内部类有什么问题?
- 26. 在内部类中访问外部类的私有成员:JRuby
- 27. java线程从静态内部类访问外部类
- 28. Java内部类访问外部类变量
- 29. Java外部类访问内部类接口常量
- 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