1

我有一个问题,我搜索了很多答案。我不确定哪个是真的。请问谁能解释一下。为什么 JVM 专门处理标记接口?示例:让我们采用其中没有任何方法的可序列化接口,但 JVM 不会抛出任何编译时异常。JVM如何对待这种接口,当我们实现标记接口时会发生什么。

4

4 回答 4

3

对于 jvm,它们没有什么特别之处。接口不需要定义任何方法。将实现空接口的类视为将类标记为特定类型的一种方式,您可以在运行时使用 instanceof 轻松检查该类型。

除了这种类型的信息,它还可以用于强调类的高级方面,或快速识别具有特定属性的类(通过人工和自动化工具或 IDE)。

于 2012-11-20T06:52:35.160 回答
1

在大多数情况下,“标记”接口是开发人员和他们编写的库的区别,而不是 JVM。

为什么 JVM 专门处理标记接口?

它没有。没有方法的接口没有特殊行为。这些接口由库设计者专门用于特定目的。

示例:让我们采用其中没有任何方法的可序列化接口,但 JVM 不会抛出任何编译时异常。

后者暗示 JVM 不知道 Serializable 接口的特殊行为。相反,它是 ObjectInputStream/ObjectOutputSTream检查的东西,仅此而已。其他序列化库可能会也可能不会对这个接口做些什么。例如 XStream 会忽略它。

JVM如何对待这种接口,当我们实现标记接口时会发生什么。

JVM 知道的关于 Serializable 的唯一特别之处是内置数组类型是可序列化的,例如

System.out.println(new byte[0] instanceof Serializable); // is true

这只是因为 JVM 知道这种类型应该是可序列化的,因为它没有在任何类中定义。这是一种特殊情况,不适用于其他标记接口。

于 2012-11-20T09:22:46.720 回答
0

如果接口没有方法,我看不出 jvm 抛出异常的任何原因。标记接口允许特定类型的实现 - 您可以进行(实例)检查并执行标记接口类型特定的自定义。JVM 必须做类似的事情。

然而,注释(Java 5 后)是标记接口的更好替代方案。

于 2012-11-20T06:59:15.577 回答
0

为什么 tagged 或 Marker 接口会被 JVM 特殊处理

他们不是。我不知道您所说的“标记”是什么意思,但这没有任何区别。

为什么 JVM 专门处理标记接口?

它不是。

示例:让我们采用其中没有任何方法的可序列化接口,但 JVM 不会抛出任何编译时异常。

没有编译时异常之类的东西,除非你有一个错误的编译器。自 1997 年以来我从未见过。如果您指的是编译错误,它们是由Java 编译器而不是 JVM打印而不是抛出的。如果你问为什么不包含任何方法的接口没有编译错误,原因是它是合法的 Java 代码:检查 Java 语言规范。

JVM 如何处理此类接口

与任何其他界面相同。

当我们实现标记接口时会发生什么。

与任何其他界面相同,尽管我不知道您所说的“标记”是什么意思。

如果在所有这些混乱中您真正要问的是“Serializable界面如何工作”?答案是该类通过运算符ObjectOutputStream检查传递给ObjectOutputStream.writeObject()的任何对象是否属于实现 的类。而已。编译器或 JVM 没有处理,只是与您自己编写的代码完全相同。Serializableinstanceof

于 2012-11-20T10:03:28.693 回答