特殊标识符:serialVersionUID 和 serialPersistentFields
Special Identifiers: serialVersionUID and serialPersistentFields
我了解这些字段是什么以及如何使用它们,但我想知道:
Java 编译器如何在其编译步骤中实际处理此类特殊字段?它真的只根据名称查找变量吗?
这看起来很不像Java...除了serialVersionUID
和serialPersistentFields
,还有其他的吗?
不幸的是,是的,这些成员是在运行时根据名称神奇地发现的。 (实际上,更糟;无论它们是静态的还是非静态的,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 是否具有 readObject
或 writeObject
方法。然后是 SPI 模式,其中服务提供商 classes(例如 JDBC Driver
classes)通过搜索 class 路径定位。 (这取决于你所说的“非Java喜欢”是什么意思...)
我不知道 SE 库中是否还有其他特殊字段,但这个问题可能没有实际意义,因为应用程序和第 3 方代码无论如何都可以做同样的事情。
我了解这些字段是什么以及如何使用它们,但我想知道:
Java 编译器如何在其编译步骤中实际处理此类特殊字段?它真的只根据名称查找变量吗?
这看起来很不像Java...除了serialVersionUID
和serialPersistentFields
,还有其他的吗?
不幸的是,是的,这些成员是在运行时根据名称神奇地发现的。 (实际上,更糟;无论它们是静态的还是非静态的,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
andserialPersistentFields
, are there others?
嗯... Java SE 库的许多其他部分使用反射来查找内容。例如,对象序列化使用反射来确定 class 是否具有 readObject
或 writeObject
方法。然后是 SPI 模式,其中服务提供商 classes(例如 JDBC Driver
classes)通过搜索 class 路径定位。 (这取决于你所说的“非Java喜欢”是什么意思...)
我不知道 SE 库中是否还有其他特殊字段,但这个问题可能没有实际意义,因为应用程序和第 3 方代码无论如何都可以做同样的事情。