public class ElvisStealer implements Serializable {
static Elvis impersonator;
private Elvis payload;
private Object readResolve() {
// Save a reference to the "unresolved" Elvis instance
impersonator = payload;
// Return an object of correct type for favorites field
return new String[] { "A Fool Such as I" };
}
private static final long serialVersionUID = 0;
}
我的问题是:
- 在哪里以及如何获取Elvis对象引用的副本?这部分没有提供太多信息。
// Save a reference to the "unresolved" Elvis instance impersonator = payload;
换句话说,子对象的 readResolve
如何访问父对象引用?
为使ElvisStealer生效,我必须通过将类型为
String []
的单例实例字段(在该情况下)替换为ElvisStealer实例来修改序列化数据。在书中,单例包含一个非transient
String []
实例字段,并且在序列化流中将该字段替换为ElvisStealer实例。然后,当那个字段被反序列化时,ObjectInputStream
看到这个字段是ElvisStealer类型的,并从ElvisStealer类调用readResolve
。我的问题是:为什么JVM在解析这样的字段时不会出错,明知道应该是String而不是ElvisStealer,其次,为什么JVM调用ElvisStealer类中的readResolve
,明知道应该是String []
,而不是ElvisStealer。为什么ElvisStealer除了静态字段外还包含一个类型为Elvis的实例字段?难道静态字段不够吗?
ElvisStealer(new).payload = Elvis(new)
//同一个Elvis,循环引用”。这在书中发生在哪里?我只看到了payload
变量的声明,但它没有以任何方式初始化。其次,静态变量impersonator
不应该足够吗?而不是初始化payload
,可以使用用于初始化payload
的值来初始化impersonator
吗? - ctomek