Marker Interface in Java

2025年3月30日 | 阅读 5 分钟

在本节中,我们将讨论 Java 中的标记接口、它的用途、内置(SerializableCloneableRemote Interfaces以及自定义标记接口和示例。

什么是标记接口?

不包含方法、字段和常量,但仅用于传递信息给 JVM 或编译器,以启用某种行为或提供运行时信息,这样的接口被称为标记接口。换句话说,一个空接口被称为标记接口标签接口。它在运行时为对象提供类型信息。正因为如此,JVM 和编译器才能获得关于对象的额外信息。SerializableCloneable 接口是标记接口的例子。简而言之,它向 JVM 发出信号或命令。

标记接口的声明与 Java 中的接口相同,但接口必须为空。例如

标记接口有两种替代方案,它们产生与标记接口相同的结果。

  • 内部标志:可以替代标记接口来指示任何特定操作。
  • 注解:自 Java 5 起,标记接口被淘汰。Java 5 提供了注解来替代标记接口以获得相同的结果。它提供了灵活的元数据能力。因此,通过将注解应用于任何类,我们可以执行特定操作。

标记接口的用途

标记接口用作标签,通过消息通知 Java 编译器,以便它可以为实现它的类添加一些特殊行为。如果我们拥有有关类的某些信息,并且这些信息永远不会改变,那么在这些情况下,Java 标记接口非常有用,可以用它来表示相同的信息。实现一个空接口会告诉编译器执行某些操作。

它用于逻辑上划分代码,并且是分类代码的好方法。对于开发 API 和 Spring 等框架更有用。

内置标记接口

Java 中,内置标记接口是 JDK 中已存在并可供使用的接口。有许多内置标记接口,其中一些是

  • Cloneable 接口
  • Serializable 接口
  • Remote 接口

让我们逐一详细讨论。

Cloneable 接口

Java 中的Cleanable 接口也是一个标记接口,属于 java.lang 包。它会创建一个具有不同名称的对象副本(复制品)。我们可以将接口实现到要克隆的对象所属的类中。它指示 Object 类的 clone() 方法。如果我们没有在类中实现 Cloneable 接口并调用 clone() 方法,它会抛出 ClassNotSupportedException

请注意,实现 Cloneable 接口的类必须用公共方法重写 clone() 方法。让我们看一个例子。

Product.java

输出

Enter product ID: 139872
Enter product name: Printer
Enter product Cost: 3459.67
-------Product Detail--------
Product ID: 139872
Product Name: Printer
Product Cost: 3459.67

Serializable 接口

这是 Java 中的一个标记接口,定义在 java.io 包中。如果我们想使类可序列化,则必须实现 Serializable 接口。如果一个类实现了 Serializable 接口,我们就可以序列化或反序列化该类的对象的状态。

序列化(将对象转换为字节流)是一种机制,其中对象的状态从内存中读取并写入文件或数据库。反序列化(将字节流转换为对象)是序列化的反向操作,意味着从文件或数据库读取对象状态并将其写回内存称为对象的反序列化。

Marker Interface in Java

可以使用 ObjectOutputStream 类实现序列化(写入),可以使用 ObjectInputStream 类实现反序列化(读取)。

让我们看一个序列化和反序列化的例子。

序列化示例

Employee.java

SerializationExample.java

输出

Data has been read from the file.

反序列化示例

让我们反序列化对象的状态。

DeserializationExample.java

输出

1187345 Andrew

Remote 接口

Remote 接口是一个标记接口,属于 java.rmi 包。它标记一个对象为远程对象,可以从另一台机器(主机)访问。如果我们想使一个对象成为远程对象,则必须实现 Remote 接口。它标识其方法可以从非本地 JVM 调用的接口。任何远程对象都必须直接或间接实现该接口。

让我们定义一个 Remote 接口并在 Java 程序中实现它。

定义 Remote 接口

实现 Remote 接口

有两种方法可以实现 Remote 接口

  • 通过扩展 UnicastRemoteObject 类
  • 通过使用 UnicastRemoteObject 类的 exportObject() 方法

AddAllRemote.java

创建并启动远程应用程序

Server.java

创建并启动客户端应用程序

Client.java

自定义标记接口

除了内置标记接口之外,Java 还允许我们创建自己的标记接口。让我们看一个例子。

CustomMarkerInterfaceExample.java

输出

Car is a vehicle.
Yes, engine is working.