采用这两个 Java 类:
class User {
final Inventory inventory;
User (Inventory inv) {
inventory = inv;
}
}
class Inventory {
final User owner;
Inventory (User own) {
owner = own;
}
}
有什么办法without using reflection*把它拉下来?我实际上并不期望它是,但问问也无妨。
更新:因为在字节码构造中有两个步骤(1. 分配对象,2. 调用构造函数**)这是否可以(ab)用于执行此操作,使用手写字节码或自定义编译器?我说的是首先对两个对象执行步骤 1,然后对两个对象执行步骤 2,使用步骤 1 中的引用。当然,这样的事情会相当麻烦,这部分问题是学术性的。
(* 因为反射可能会给安全管理器带来麻烦)
(** 表示我的知识有限)
最佳答案
只有当其中一个对象由另一个对象创建时,这才能干净地工作。例如,您可以将 User
类更改为如下内容(同时保持 Inventory
类不变):
class User {
private final Inventory inventory;
User () {
inventory = new Inventory(this);
}
}
您需要小心访问 Inventory
构造函数中的 User
对象,但是:它尚未完全初始化。例如,它的 inventory
字段仍然是 null
!
广告更新:我现在已经确认字节码操作方法不起作用。我试过使用 Jasmin它总是无法加载 VerifyError
.
深入研究这个问题,我发现 § 4.10.2.4 Instance Initialization Methods and Newly Created Objects .本节介绍 JVM 如何确保仅传递已初始化的对象实例。
关于java - 有什么好方法可以让两个不可变对象(immutable对象)互相引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7978616/