`

java中的标记接口(标签接口)

阅读更多
Java中的标记接口(Marker Interface),又称标签接口(Tag Interface),具体是不包含任何方法的接口。

在Java中很容易找到标记接口的例子,比如JDK中的Serialzable接口就是一个标记接口。

首先要明确的是,标记接口并不是Java语言独有的,而是计算机科学中的一种通用的设计理念。
The tag/marker interface pattern is a design pattern in computer science, used with languages that provide run-time type information about objects. It provides a means to associate metadata with a class where the language does not have explicit support for such metadata.

上面这段话是维基百科对标记接口的定义。

具体说的就是,标记接口是计算机科学中的一种设计思路,用于给那些面向对象的编程语言描述对象。因为编程语言本身并不支持为类维护元数据,而标记接口可以用作描述类的元数据,弥补了这个功能上的缺失。对于实现了标记接口的类,我们就可以在运行时通过反射机制去获取元数据。

以Serializable接口为例,如果一个类实现了这个接口,则表示这个类可以被序列化。因此,我们实际上是通过了Serializable这个接口给该类标记了【可被序列化】的元数据,打上了【可被序列化】的标签。这也是标记/标签接口名字的由来。

具体在Java中,标记接口主要有以下两种目的:

1.建立一个公共的父接口。比如EventListener接口,一个由几十个其它接口扩展的Java API,当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。同样的,你可以使用一个标记接口来建立一组接口的父接口。

2.向一个类添加数据类型。这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过Java的多态性可以变成一个接口类型。

更多的,一些容器例如Ejb容器,Servlet容器或运行时环境依赖标记接口识别类是否需要进行某种处理,比如Serialialbe接口标记类需要进行序列化操作。

当然了,在现在Spring流行的时代,注解(Annotation)已经成为了最好的维护元数据的方式。因为注解能声明在包、类、字段、方法、局部变量、方法参数等之上,既灵活又方便地起到维护元数据的目的。

然而注解这么好的东西,只有在JDK1.5之后才能用。JDK1.5之前维护元数据的重任就落在标记接口的肩膀上了。可以看看另一个标记接口Cloneable的源码,里面的注释清晰地标注了该接口从JDK1.0的时代就有了

package java.lang;

/**
 * @author  unascribed
 * @see     java.lang.CloneNotSupportedException
 * @see     java.lang.Object#clone()
 * @since   JDK1.0
 */
public interface Cloneable {
}

这时候,如果一个类没有实现Cloneable接口,在执行clone方法时JVM就会抛出CloneNotSupportedException异常。

另外的,可以使用instanceof关键字运算符来进行类型查询。

if (obj instanceof Cloneable) {
    // do something...
} 


最后列举出Java源码中几个标记接口的优秀例子。

java.io.Serializable:未实现此接口的类将无法使其任何状态序列化或反序列化。为保证serialVersionUID值跨不同Java编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID值。

java.lang.Cloneable:表明Object.clone()方法可以合法地对该类实例进行按字段复制。实现此接口的类应该使用公共方法重写Object.clone(它是受保护的)。如果在没有实现 Cloneable接口的实例上调用Object的clone()方法,则会导致抛出CloneNotSupportedException异常。

java.util.RandomAccess:用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。

java.rmi.Remote:Remote接口用于标识其方法可以从非本地虚拟机上调用的接口。任何远程对象都必须直接或间接实现此接口。只有在远程接口(扩展java.rmi.Remote的接口)中指定的这些方法才可远程使用。
分享到:
评论

相关推荐

    JSF Java Server Faces (JSF)框架

    JSF(Java Server Faces)技术为开发基于网络用户界面的Java开发者提供了标准的编程接口API以及标签库。就像Struts框架一样,JSF定义了一套JSF标签 JSF的全称  1、Joint Strike Fighter (JSF)  2、Java Server ...

    L1接口协议的Java实现.pdf

    L1接口协议采用HTTP/XML作为底层协议及编码形式,XML作为一种可扩展标记语言,它的优点在于可以自定义标签来满足不同的数据结构需求,这使得通信接口具有很高的灵活性。在L1接口协议中,MPC设置有两个HTTP端口用于...

    Java自定义标签 教程

    3. `SimpleTag`:JSP2.0引入的简化版标签接口,用于简化开发过程。它的处理类需实现`SimpleTag`接口。 4. 还有一些其他接口,如`TagSupport`, `BodyTagSupport`等,是`Tag`接口的子接口,提供了默认实现。 **自定义...

    java6创建webservice,原来这么简单啊

    在Java 6中,首先我们需要定义一个服务接口,这个接口通常会有一个`@WebService`注解,用来标记这是一个Web服务接口。例如: ```java @WebService public interface HelloWorldService { @WebMethod String ...

    JSP分面标签--JAVA分面标签

    - 保持标签接口简洁,避免过于复杂的逻辑。 - 标签的命名应具有描述性,方便其他开发者理解。 - 适当地使用属性传递参数,但避免过多的属性导致标签难以使用。 - 为每个分面标签提供详细的文档说明,方便团队...

    基于Java的源码-html 标记大全.zip

    "java"标签表明了这是与Java语言相关的技术,"软件/插件"可能意味着这是一个可以集成到其他Java应用中的组件,或者是作为一个独立的工具来使用。"html"标签则强调了这个项目的核心是围绕HTML标记操作。 【压缩包子...

    Java开发技术大全(500个源代码).

    outputMax.java 求两个数中的最大数 overflowExample.java 演示溢出 precedence.java 演示自加运算符的优先级 primeNumber.java 输出100-200之间的所有素数 ranking.java 评定成绩等级 rankingBySwitch.java ...

    在C#中使用Java本机接口

    标题中的“在C#中使用Java本机接口”是指通过C#编程语言调用Java的本地接口(JNI,Java Native Interface)来实现跨平台的互操作性。这通常发生在需要利用现有Java库或功能,而开发环境主要基于.NET Framework的...

    基于java的Google地图JSP标签库.zip

    【标题】"基于Java的Google地图JSP标签库"是一个专为Java开发人员设计的工具,它使得在JSP(JavaServer Pages)中集成和操作Google地图变得更加简单。这个库通常包含一系列预定义的JSP标签,允许开发者通过XML-like...

    java将markdown文档转换成html,生成左侧目录

    Java中存在多种库可以处理Markdown解析,如Pandoc、Commons-Markdown、Flexmark等。这些库可以将Markdown文本转换为HTML元素,方便进一步处理。 接下来,我们需要构建HTML结构。基本的HTML页面通常包含`<head>`(元...

    JSP标签,采用web.xml引入标签库描述文件

    2. **实现标签处理类(Tag Handler Class)**:自定义标签的核心是Java类,它实现了`javax.servlet.jsp.tagext.Tag`接口或其子接口。这个类负责处理标签的行为,如`doStartTag()`和`doEndTag()`方法。 3. **在JSP...

    java自定义注解\标签库\监听\junit简单测试

    标签库(Tag Library)在Java中通常是指JSP(JavaServer Pages)中的自定义标签库,它们提供了一种方式来封装复杂的HTML或业务逻辑,使得页面更加易读和可维护。创建一个JSP标签库涉及以下步骤: 1. 创建TLD(Tag ...

    基于Java的实例源码-增强现实标记跟踪软件库 AccuTag.zip

    5. **Java编程接口**:作为Java库,AccuTag会提供API供开发者调用,这些接口可能包括初始化追踪器、更新图像数据、获取标记信息等功能。 6. **跨平台性**:Java的“一次编写,到处运行”特性意味着AccuTag可以在...

    axis2webservice接口例子

    - 如何创建一个简单的Java接口并标记为@WebService。 - 如何编写服务实现类,实现服务接口。 - 了解并编写WSDL文件,定义服务接口和消息格式。 - 使用Axis2工具将服务打包成.aar文件,并部署到Axis2服务器上。 - ...

    java开源包1

    Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips ...

    Java面试总结

    在Java中,接口中的方法默认是public和abstract,不能是static、native或synchronized。数组和String都有length()方法用于获取长度,但它们不是对象方法,而是属性。 在集合框架中,Set用于存储不重复的元素,区分...

    java应用开发中使用的ar包

    以下将详细讲解这些标签所代表的Java技术及其在开发中的应用。 1. **JDBC(Java Database Connectivity)**:JDBC是Java平台上的标准API,用于与各种数据库进行交互。它提供了一组接口和类,使得开发者可以编写与...

    去掉所有的html标签

    通过上述讨论,我们可以看到使用Java编程语言去除非结构化HTML文本中的标签是一项实用且高效的技术。它不仅能够帮助我们在数据分析、文本处理等领域提高效率,还能为用户提供更加清晰、简洁的信息展示方式。当然,在...

Global site tag (gtag.js) - Google Analytics