先看看什么是标记接口?标记接口有时也叫标签接口(Tag interface),即接口不包含任何方法。在Java里很容易找到标记接口的例子,比如JDK里的Serializable接口就是一个标记接口。

首先明确一点,Marker Interface(标记接口)决不是Java这门编程语言特有的,而是计算机科学中一种通用的设计理念。

我们看Wikipedia里对标记接口的定义。

“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.“

我试了下Google Translate翻译上面这段话,翻得很差劲,所以我来解释一下。

标记接口是计算机科学中的一种设计思路。编程语言本身不支持为类维护元数据。而标记接口则弥补了这个功能上的缺失——一个类实现某个没有任何方法的标记接口,实际上标记接口从某种意义上说就成为了这个类的元数据之一。运行时,通过编程语言的反射机制,我们就可以在代码里拿到这种元数据。

以Serializable接口为例。一个类实现了这个接口,说明它可以被序列化。因此,我们实际上通过Serializable这个接口,给该类标记了“可被序列化”的元数据,打上了“可被序列化”的标签。这也是标记/标签接口名字的由来。

下面的代码是我从JDK源代码中摘出来的:

if (obj instanceof String) {writeString((String) obj, unshared);
} else if (cl.isArray()) {writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {writeEnum((Enum) obj, desc, unshared);
} else if (obj instanceof Serializable) {writeOrdinaryObject(obj, desc, unshared);
} else {if (extendedDebugInfo) {throw new NotSerializableException(cl.getName() + " "+ debugInfoStack.toString());} else {throw new NotSerializableException(cl.getName());}
}

Java里的序列化,字符串,数组,枚举类和普通类是分别进行的。如果当前待序列化的变量既不是字符串,也不是数组和枚举类,那么就检测该类是否实现了Serializable的接口,大家注意下图第1177行就执行了这种检测。如果没有实现Serializable接口,就会抛出异常NotSerializableException。

大家也许会问,在Spring里满天飞的注解(Annotation)不是最好的用来维护元数据的方式么?确实,Annotation能声明在Java包、类、字段、方法、局部变量、方法参数等的前面用于维护元数据的目的,既灵活又方便。然而这么好的东西,只有在JDK1.5之后才能用。JDK1.5之前维护元数据的重任就落在标记接口上了。

大家看另一个标记接口,Cloneable。下图第51行清晰标注了该接口从JDK1.0起就有了。

JDK源代码里的Clone方法的注释也清晰注明了,如果一个类没有实现Cloneable接口,在执行clone方法时会抛出CloneNotSupportedException异常。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

什么是Java Marker Interface(标记接口) 1相关推荐

  1. 什么是Java Marker Interface(标记接口)

    先看看什么是标记接口?标记接口有时也叫标签接口(Tag interface),即接口不包含任何方法.在Java里很容易找到标记接口的例子,比如JDK里的Serializable接口就是一个标记接口. ...

  2. java中的标记接口

    在java 中,RandomAccess和Cloneable .Serializable一样,都是标志性接口,不需要任何实现,只是又来表明其实现类具体有某种特质的,实现了Cloneable表明可以拷贝 ...

  3. java native 接口_Java本地接口--Java Native Interface (JNI)

    一.方法介绍 java native方法是指本地方法,当在方法中调用一些不是由java语言写的代码或者在方法中用java语言直接操纵计算机硬件时要声明为native方法. java中,通过JNI(Ja ...

  4. 标记接口,注解和注解处理器的前世今生

    文章目录 简介 注解的起源和marker interfaces 注解的定义 Retention Target 自定义参数 在运行时使用注解 在编译时使用注解 总结 简介 相信大部分的开发者都用过注解, ...

  5. Java进阶篇之接口

    Java编程之面向接口 本篇内容: 1.接口的引入 2.接口的实现 3.抽象类与接口的区别 4.小结 1.接口的引入 接口,类似于实际生活中的插座接口,只要你的插头符合接口的规范,比如大小.形状等,那 ...

  6. java cloneable 接口_Cloneable 接口 记号接口(标记接口)

    Cloneable 接口指示了一个类提供了一个安全的clone方法. 首先了解Object.clone()方法: clone是Object超类的一个protected方法,用户代码不能直接调用这个方法 ...

  7. java的标记接口_Java中的标记接口?

    我被教授,Java中的Marker接口是一个空接口,用于向编译器或JVM发送信号,实现此接口的类的对象必须以特殊方式处理,如序列化,克隆等. 但最近我了解到,它实际上与编译器或JVM无关.例如,在Se ...

  8. java 标记_java – 标记注释与标记接口

    在阅读有关Marker接口的文章时,我偶然发现了以下网站:Item 37: Use marker interfaces to define types 根据Joshua Bloch的说法,Marker ...

  9. ABAP和Java的tag(marker) interface

    In my previous blog How many fat interfaces are there in SAP system I introduce the concept of " ...

最新文章

  1. LeetCode 1474. 删除链表 M 个节点之后的 N 个节点
  2. php mysql 单例模式_PHP基于单例模式实现的mysql类
  3. css3的cursor
  4. 全球首发!计算机视觉Polygon Mesh Processing总结8——Remeshing Global Structure和Correspondences
  5. Jsp页面用table表格来让文字和文本框对齐
  6. Latex插入项目符号和编号{itemize}和{enumerate}
  7. Atitit 发帖机系列(6) USRQBN2201 setup spec安装程序的实现规范与标准化解决方案
  8. 计算机技术职业资格考试
  9. Ps2021软件安装Mac(含M1)、Windows版
  10. MongoDB的用户管理总结
  11. 聚焦交通缓堵之东城篇,核心区如何重拳治堵
  12. tomcat consider increasing the maximum size of the cache
  13. 松弛法求解给定边界条件的泊松方程
  14. 继电器分类及性能对比
  15. 数三退一问题||拉手成圈出圈问题
  16. 社交口才:处理好人际关系的七种谈话技巧
  17. 基于jsp+mysql+Spring+SpringMVC+mybatis的ssm汽车配件管理系统
  18. 重塑科技燃料电池试验检测中心获CNAS认可评审,综合实力备受认可
  19. 万能密码HTTP基本方法 —— 【WUST-CTF2020】admin
  20. 论文翻译:2021_语音增强模型压缩_Towards model compression for deep learning based speech enhancement...

热门文章

  1. (47)LINUX应用编程和网络编程之二Linux文件属性
  2. 每天干的啥?(2017.6)
  3. NOIP201501金币
  4. EF:oracle的number类型映射为C#的boolean类型
  5. 如何简单快速的修改Bootstrap
  6. Developer Express 之 XtraReport如何动态绑定数据
  7. Err:error occurred at recursive SQL level 1
  8. JAVA设计模式-观察者模式(Observe)
  9. 注解-@Conditional的使用
  10. JUnit5 @BeforeAll注解示例