【问题标题】:Special Identifiers: serialVersionUID and serialPersistentFields特殊标识符:serialVersionUID 和 serialPersistentFields
【发布时间】:2021-04-25 09:05:27
【问题描述】:

我了解这些字段是什么以及如何使用它们,但我想知道:

Java 编译器如何在其编译步骤中实际处理此类特殊字段?它真的只根据变量的名称来查找变量吗?

这似乎很不像 Java……除了serialVersionUIDserialPersistentFields,还有其他的吗?

【问题讨论】:

    标签: java serialization javac serialversionuid


    【解决方案1】:

    不幸的是,是的,这些成员是通过名称神奇地发现的,在运行时进行反思。 (实际上,情况更糟;无论它们是静态的还是非静态的、公共的还是私有的等,都适合查找。)你是对的,这不是一个好的做法,也不是很像 Java,但这是我们的遗产被卡住了。

    完整列表见序列化规范:https://docs.oracle.com/en/java/javase/11/docs/specs/serialization/index.html

    【讨论】:

    • 明确地说,这将提供基于名称引用的字段的完整列表,这些字段是 Java 序列化的一部分,而不是在核心 Java 库中的其他上下文中使用的任何字段。
    【解决方案2】:

    我想知道 java 编译器实际上是如何在其编译步骤中处理像这样的特殊字段的。

    不涉及编译器。这些字段是在运行时通过反射发现的。

    除了serialVersionUIDserialPersistentFields,还有其他的吗?

    嗯 ... Java SE 库的许多其他部分使用反射来查找内容。例如,对象序列化使用反射来确定一个类是否具有readObjectwriteObject 方法。然后是通过搜索类路径来定位服务提供者类(例如 JDBC Driver 类)的 SPI 模式。 (这取决于您所说的“非Java”的意思......)

    我不知道 SE 库中是否还有其他特殊字段,但这个问题可能没有实际意义,因为应用程序和 3rd-party 代码无论如何都可以做同样的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 2021-03-31
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多