gpt4 book ai didi

java - 匿名类二进制名称

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:58:36 26 4
gpt4 key购买 nike

我有以下问题:

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 说匿名类的名称应该是封闭类的名称、“$”符号和非空数字序列,而没有对这些序列设置任何限制。

我认为我不应该依赖匿名类的内部名称,我也知道解决该问题的“正确”方法,例如在构建服务器上生成预序列化数据。遗憾的是我们现在没有太多时间来解决这个问题,所以我想知道这个命名差异是从哪里来的,这样我现在就可以解决这个问题。

最佳答案

我敢挑战一些元素吗?希望它对你有用:

  1. 如果你想让你的类(class)有一个众所周知的名字……好吧,匿名是有名类(class)的对立面! ;-)
  2. 对象作为二进制数据预序列化和交付是一个危险的选择,您会被它咬伤(在重构期间,但我相信这可能会在许多其他情况下发生)。序列化数据通常被认为是 Java 中的短期解决方案,只持续几秒钟。许多其他选项可用于长期存储。

现在,如果要求解决您的短期问题,我看到的唯一方法是将您的类恢复到与以前版本兼容的状态。如果您提到的不同顺序是唯一的区别,我相信按照与以前相同的顺序定义匿名类是值得尝试的!还要注意引用应该是向后的(指向文件前面的类),而不是向前的(指向文件后面的类)。

关于java - 匿名类二进制名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1519944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com