java - 匿名类二进制名称

标签 java

我有以下问题:

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/

相关文章:

java - spring-boot 属性注入(inject)在自定义@Configuration 类中不起作用

java - JXLS 忽略模板样式,如何强制它保持模板文件中的列宽?

java - 如何根据字符串的组合删除重复项?

java - 在过滤的 JTable 上选择特定的表模型元素

java - new File(path) 实际上总是在 android 上创建一个文件?

java - 查找保存 int 数所需的位数

java - 防止向用户显示任何异常?

java - jdk9中有没有WindowsLookAndFeel.java的替代品

java - 动态设置一个ContentProvider的权限

java - 即使按下停止按钮也无法停止警报响起