- 浏览: 72144 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (113)
- oracle数据 (2)
- eclipse (3)
- 工具类使用 (14)
- 分隔符 (1)
- socket (1)
- ServletContextListener (1)
- String (3)
- StringUtils工具类 (2)
- springboot拦截器 (1)
- 页面 (2)
- map (1)
- 密码加密 (3)
- 缓存 (1)
- 文件上传 (1)
- 算法 (3)
- jquery (1)
- DateFormatUtils (1)
- xml (2)
- ftp (1)
- 接口 (3)
- 公钥私钥 (1)
- sigar (1)
- 前端 (2)
- lang3 (1)
- 定时器 (1)
- java基础 (13)
- javaBean (1)
- 工具类 (2)
- 插件 (1)
- 数据库 (2)
- 项目 (4)
- springboot (6)
- java集合 (1)
- 测试 (1)
- thymeleaf (3)
- mysql (7)
- 分布式 (1)
- idea (1)
- TCP (1)
- 微服务 (1)
- 高并发 (3)
- redis (1)
- 多线程 (2)
- SpringCloud (1)
- spring (1)
- 1111 (0)
- 开源 (1)
- npm (1)
最新评论
Java中的标记接口(Marker Interface),又称标签接口(Tag Interface),具体是不包含任何方法的接口。
在Java中很容易找到标记接口的例子,比如JDK中的Serialzable接口就是一个标记接口。
首先要明确的是,标记接口并不是Java语言独有的,而是计算机科学中的一种通用的设计理念。
上面这段话是维基百科对标记接口的定义。
具体说的就是,标记接口是计算机科学中的一种设计思路,用于给那些面向对象的编程语言描述对象。因为编程语言本身并不支持为类维护元数据,而标记接口可以用作描述类的元数据,弥补了这个功能上的缺失。对于实现了标记接口的类,我们就可以在运行时通过反射机制去获取元数据。
以Serializable接口为例,如果一个类实现了这个接口,则表示这个类可以被序列化。因此,我们实际上是通过了Serializable这个接口给该类标记了【可被序列化】的元数据,打上了【可被序列化】的标签。这也是标记/标签接口名字的由来。
具体在Java中,标记接口主要有以下两种目的:
1.建立一个公共的父接口。比如EventListener接口,一个由几十个其它接口扩展的Java API,当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。同样的,你可以使用一个标记接口来建立一组接口的父接口。
2.向一个类添加数据类型。这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过Java的多态性可以变成一个接口类型。
更多的,一些容器例如Ejb容器,Servlet容器或运行时环境依赖标记接口识别类是否需要进行某种处理,比如Serialialbe接口标记类需要进行序列化操作。
当然了,在现在Spring流行的时代,注解(Annotation)已经成为了最好的维护元数据的方式。因为注解能声明在包、类、字段、方法、局部变量、方法参数等之上,既灵活又方便地起到维护元数据的目的。
然而注解这么好的东西,只有在JDK1.5之后才能用。JDK1.5之前维护元数据的重任就落在标记接口的肩膀上了。可以看看另一个标记接口Cloneable的源码,里面的注释清晰地标注了该接口从JDK1.0的时代就有了
这时候,如果一个类没有实现Cloneable接口,在执行clone方法时JVM就会抛出CloneNotSupportedException异常。
另外的,可以使用instanceof关键字运算符来进行类型查询。
最后列举出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的接口)中指定的这些方法才可远程使用。
在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的接口)中指定的这些方法才可远程使用。
发表评论
-
幂等性
2020-06-28 19:17 315幂等性的 6 种实现方式,包括前端拦截、数据库悲观锁实现、数据 ... -
List如何一边遍历,一边删除?
2020-06-10 12:21 536主要有以下3种方法: 使用Iterator的remove ... -
Java 泛型中的通配符 T,E,K,V,?
2020-05-25 13:52 381本质上这些个都是通配符,没啥区别,只不过是编码时的一种约定俗 ... -
Java泛型中E、T、K、V等的含义
2020-05-12 16:31 792Java泛型中的标记符含义: ——————————————— ... -
字段校验
2019-04-29 10:12 405今天研究一下本公司系 ... -
防止页面被iframe嵌入
2019-04-17 20:07 432if (window != top){ top.lo ... -
在tomcat下context.xml中配置各种数据库连接池(JNDI)
2019-04-17 20:02 587Tomcat6的服务器配置文件放在 ${tomcat6}/ ... -
indexOf
2019-04-15 20:20 355indexOf(int,ch) ... -
equals与equalsIgnoreCase
2019-04-15 20:16 579String fileName=".SHP" ... -
JAVA中字符串比较equals()和equalsIgnoreCase()的区别
2018-04-10 13:54 6361、使用equals( )方法比较两个字符串是否相等。它具有如 ... -
Java system.getproperty获取环境属性
2018-04-18 10:56 476序号 属性 说明 1 java.version Java 运行 ... -
HashMap遍历的两种方式,推荐使用entrySet()
2018-01-12 13:37 2969第一种: Map map = new HashMap(); ...
相关推荐
JSF(Java Server Faces)技术为开发基于网络用户界面的Java开发者提供了标准的编程接口API以及标签库。就像Struts框架一样,JSF定义了一套JSF标签 JSF的全称 1、Joint Strike Fighter (JSF) 2、Java Server ...
L1接口协议采用HTTP/XML作为底层协议及编码形式,XML作为一种可扩展标记语言,它的优点在于可以自定义标签来满足不同的数据结构需求,这使得通信接口具有很高的灵活性。在L1接口协议中,MPC设置有两个HTTP端口用于...
3. `SimpleTag`:JSP2.0引入的简化版标签接口,用于简化开发过程。它的处理类需实现`SimpleTag`接口。 4. 还有一些其他接口,如`TagSupport`, `BodyTagSupport`等,是`Tag`接口的子接口,提供了默认实现。 **自定义...
在Java 6中,首先我们需要定义一个服务接口,这个接口通常会有一个`@WebService`注解,用来标记这是一个Web服务接口。例如: ```java @WebService public interface HelloWorldService { @WebMethod String ...
- 保持标签接口简洁,避免过于复杂的逻辑。 - 标签的命名应具有描述性,方便其他开发者理解。 - 适当地使用属性传递参数,但避免过多的属性导致标签难以使用。 - 为每个分面标签提供详细的文档说明,方便团队...
"java"标签表明了这是与Java语言相关的技术,"软件/插件"可能意味着这是一个可以集成到其他Java应用中的组件,或者是作为一个独立的工具来使用。"html"标签则强调了这个项目的核心是围绕HTML标记操作。 【压缩包子...
outputMax.java 求两个数中的最大数 overflowExample.java 演示溢出 precedence.java 演示自加运算符的优先级 primeNumber.java 输出100-200之间的所有素数 ranking.java 评定成绩等级 rankingBySwitch.java ...
标题中的“在C#中使用Java本机接口”是指通过C#编程语言调用Java的本地接口(JNI,Java Native Interface)来实现跨平台的互操作性。这通常发生在需要利用现有Java库或功能,而开发环境主要基于.NET Framework的...
【标题】"基于Java的Google地图JSP标签库"是一个专为Java开发人员设计的工具,它使得在JSP(JavaServer Pages)中集成和操作Google地图变得更加简单。这个库通常包含一系列预定义的JSP标签,允许开发者通过XML-like...
Java中存在多种库可以处理Markdown解析,如Pandoc、Commons-Markdown、Flexmark等。这些库可以将Markdown文本转换为HTML元素,方便进一步处理。 接下来,我们需要构建HTML结构。基本的HTML页面通常包含`<head>`(元...
2. **实现标签处理类(Tag Handler Class)**:自定义标签的核心是Java类,它实现了`javax.servlet.jsp.tagext.Tag`接口或其子接口。这个类负责处理标签的行为,如`doStartTag()`和`doEndTag()`方法。 3. **在JSP...
标签库(Tag Library)在Java中通常是指JSP(JavaServer Pages)中的自定义标签库,它们提供了一种方式来封装复杂的HTML或业务逻辑,使得页面更加易读和可维护。创建一个JSP标签库涉及以下步骤: 1. 创建TLD(Tag ...
15. **implements**:用于声明一个类实现一个或多个接口,强制该类实现接口中定义的所有方法。 16. **import**:引入外部类或包,使得代码可以不使用全限定名引用它们。 17. **instanceof**:检查对象是否是特定类...
5. **Java编程接口**:作为Java库,AccuTag会提供API供开发者调用,这些接口可能包括初始化追踪器、更新图像数据、获取标记信息等功能。 6. **跨平台性**:Java的“一次编写,到处运行”特性意味着AccuTag可以在...
- 如何创建一个简单的Java接口并标记为@WebService。 - 如何编写服务实现类,实现服务接口。 - 了解并编写WSDL文件,定义服务接口和消息格式。 - 使用Axis2工具将服务打包成.aar文件,并部署到Axis2服务器上。 - ...
Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips ...
以上是对给定文件标题、描述、标签和部分内容中提到的Java知识点的详细说明,涵盖了抽象方法与类、Native方法、垃圾回收机制、接口、内部类、异常处理、编程规范、文件与流式I/O、图形界面编程以及Applet等多个方面...
在Java中,接口中的方法默认是public和abstract,不能是static、native或synchronized。数组和String都有length()方法用于获取长度,但它们不是对象方法,而是属性。 在集合框架中,Set用于存储不重复的元素,区分...
以下将详细讲解这些标签所代表的Java技术及其在开发中的应用。 1. **JDBC(Java Database Connectivity)**:JDBC是Java平台上的标准API,用于与各种数据库进行交互。它提供了一组接口和类,使得开发者可以编写与...
在企业级应用开发中,XML(可扩展标记语言)经常被用作数据交换格式,尤其在集成不同系统或服务时。Java作为一种广泛使用的后端编程语言,提供了多种方式来解析XML文档,使得处理多级嵌套的数据变得可能。本文将详细...