特殊标识符:serialVersionUID 和 serialPersistentFields

Special Identifiers: serialVersionUID and serialPersistentFields

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

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

这看起来很不像Java...除了serialVersionUIDserialPersistentFields,还有其他的吗?

不幸的是,是的,这些成员是在运行时根据名称神奇地发现的。 (实际上,更糟;无论它们是静态的还是非静态的,public 或私有的等等,都适合查找。)你是对的,这不是一个好的做法,而且不是 Java-喜欢,但这是我们坚持的遗产。

有关完整列表,请参阅序列化规范:https://docs.oracle.com/en/java/javase/11/docs/specs/serialization/index.html

I'm wondering how the java compiler actually works special fields like this into its compilation step.

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

Other than serialVersionUID and serialPersistentFields, are there others?

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

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