【发布时间】:2021-04-25 09:05:27
【问题描述】:
我了解这些字段是什么以及如何使用它们,但我想知道:
Java 编译器如何在其编译步骤中实际处理此类特殊字段?它真的只根据变量的名称来查找变量吗?
这似乎很不像 Java……除了serialVersionUID 和 serialPersistentFields,还有其他的吗?
【问题讨论】:
标签: java serialization javac serialversionuid
我了解这些字段是什么以及如何使用它们,但我想知道:
Java 编译器如何在其编译步骤中实际处理此类特殊字段?它真的只根据变量的名称来查找变量吗?
这似乎很不像 Java……除了serialVersionUID 和 serialPersistentFields,还有其他的吗?
【问题讨论】:
标签: java serialization javac serialversionuid
不幸的是,是的,这些成员是通过名称神奇地发现的,在运行时进行反思。 (实际上,情况更糟;无论它们是静态的还是非静态的、公共的还是私有的等,都适合查找。)你是对的,这不是一个好的做法,也不是很像 Java,但这是我们的遗产被卡住了。
完整列表见序列化规范:https://docs.oracle.com/en/java/javase/11/docs/specs/serialization/index.html
【讨论】:
我想知道 java 编译器实际上是如何在其编译步骤中处理像这样的特殊字段的。
不涉及编译器。这些字段是在运行时通过反射发现的。
除了
serialVersionUID和serialPersistentFields,还有其他的吗?
嗯 ... Java SE 库的许多其他部分使用反射来查找内容。例如,对象序列化使用反射来确定一个类是否具有readObject 或writeObject 方法。然后是通过搜索类路径来定位服务提供者类(例如 JDBC Driver 类)的 SPI 模式。 (这取决于您所说的“非Java”的意思......)
我不知道 SE 库中是否还有其他特殊字段,但这个问题可能没有实际意义,因为应用程序和 3rd-party 代码无论如何都可以做同样的事情。
【讨论】: