【发布时间】:2009-10-05 12:59:50
【问题描述】:
我有以下问题:
1) 有一些抽象类A,在A的静态字段中存储了几个匿名子类。两个匿名子类之间存在循环依赖关系。该抽象类的代码类似于以下:
class A implements Serializable
{
public static final A _1 = new A() {
public A foo()
{
return _2;
}
};
public static final A _2 = new A() {
public A foo()
{
return _1;
}
};
public static final A _3 = new A() {
public void bar()
{
// do something
}
};
}
2) 类 A 的实例被序列化中使用的其他对象引用。有一些对象被开发者预序列化,然后作为二进制数据包含在发布中。
在发布版本中更改了匿名子类的类二进制名称的一些重构之后。我认为这可能是由于 java 编译器版本的不同。从我机器上创建的 .class 文件中,我可以看到存储在 _1、_2 和 _3 字段中的 A 的匿名子类的名称分别为 A$1、A$2 和 A$3,但从发布版本中获取的 .class 文件中,我可以看到存储在 _1、_2 和 _3 字段中的 A 的匿名子类分别具有名称 A$2、A$3 和 A$1。由于这个预序列化的数据变得无法使用,我需要以某种方式解决这个问题。
有没有关于 java 编译器或 JVM 的规范说明我应该为我的匿名类指定什么二进制名称? JLS 规定匿名类的名称应该是封闭类的名称、“$”符号和非空数字序列,而不对这些序列设置任何限制。
我相信我不应该依赖匿名类的内部名称,我也知道解决该问题的“正确”方法,例如在构建服务器上生成预序列化数据。太糟糕了,我们现在没有太多时间了,所以我想知道这个命名差异是从哪里来的,所以我现在可以解决这个问题。
【问题讨论】:
标签: java