我有以下问题:匿名类的二进制名
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的实例被序列化中使用的其他对象引用。有一些对象被开发者预先序列化,然后作为二进制数据包含在发行版中。
在发布版本中更改了匿名子类的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表示匿名类的名称应该是封闭类的名称,“$” - 不对这些序列设置任何约束的符号和非空序列。
我相信我不应该依赖匿名类的内部名称,我也知道“正确的”方法来解决这个问题,比如在构建服务器上生成预序列化的数据。太糟糕了,我们现在没有太多时间来解决这个问题,所以我想知道这个命名差异来自哪里,所以我现在可以解决这个问题。
在A $ 1类的反序列化过程中,出现“本地类不兼容”异常。发生这种情况是因为名称A $ 1的类定义与序列化期间的类定义不同。 – okutane
在这种情况下,[本文] [http://www.informit.com/articles/article.aspx?p=31936]可能会有所帮助。 –
是的,这是编译器的差异。然而,我还没有想出它...... – okutane