Java开发笔记(八十二)注解的基本单元——元注解
Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义。前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {}
又如注解@FunctionalInterface,它的源码定义与之类似:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}
乍看过去,注解的定义竟与接口有几分相像,接口的类型名称是“interface”,而注解的类型名称是“@interface”,仅仅多了一个@符号。此外,内置注解的定义代码上方多出了好几个其它注解,包括@Target、@Retention、@Documented等等,这三个注解连同@Inherited组成了Java的“元注解”。四个元注解的作用是给新定义的注解添加修饰,标明新注解什么能干什么不能干,好比给一个战士配备各式各样的武器,使得他更适合在某种环境之中作战。接下来就对四种元注解分别进行详细介绍:
1、@Documented
该注解表示它修饰的注解将被收录到Java的开发文档中,这意味着程序员编码时的快捷提示会出现已收入的注解。
所谓的快捷提示,指的是每当程序员输入少数几个字符并按下“Alt+/”时,eclipse就自动弹出以这几个字符开头的词汇列表,以便程序员迅速选择想要的词汇,从而加快编码速度。比如,程序员在某个空行输入字母M,然后按下组合键“Alt+/”,eclipse会弹出以M打头的词汇列表,包括数学函数库Math、映射Map、方法Method等等,此时点击“Method”这行提示,eclipse便自动把M补齐成为Method。
添加了@Documented的注解如@FunctionalInterface,就会出现在这种提示列表;而@Override没被@Documented所修饰,就不会在提示列表中出现。故而程序员在一个空行输入符号@,然后按下组合键“Alt+/”,弹出的词汇列表中能找到“@FunctionalInterface”,却不能找到“@Override”了。
2、@Target
该注解表示它修饰的注解将作用于哪一类的代码实体,例如ElementType.METHOD规定@Override对方法有效,而ElementType.TYPE规定@FunctionalInterface对类型有效。更多的ElementType取值说明见下:
TYPE:类型,包括类、接口和枚举。
FIELD:字段,即类的属性。
METHOD:方法,但不包含构造方法。
PARAMETER:方法的参数。
CONSTRUCTOR:构造方法。
LOCAL_VARIABLE:局部变量。
ANNOTATION_TYPE:注解类型。
PACKAGE:包。
3、@Retention
该注解表示它修饰的注解将被编译器保留至哪个阶段,例如“@Retention(RetentionPolicy.SOURCE)”规定编译器只在编码阶段保留@Override,而“@Retention(RetentionPolicy.RUNTIME)”规定编译器直到运行阶段仍然保留@FunctionalInterface。更多的RetentionPolicy取值说明见下:
SOURCE:只在编码阶段保留。
CLASS:保留在编译生成的class文件中,但不在运行时保留。这样从class文件反编译出来的源码仍可找到它所修饰的注解。
RUNTIME:一直保留至运行阶段。这样修饰后的注解可通过反射技术读取获得,以便代码在运行时动态校验注解。
4、@Inherited
该注解表示它修饰的注解将允许被子类所继承。
通常情况下,一个注解加在某个类上面的话,它只对当前类有效,而对当前类的子类无效。倘若程序员希望该注解同时作用于当前类及其所有子类,则需要给这个注解的定义代码添加@Inherited修饰,表示该注解的作用范围扩展到当前类派生出来的子类。
更多Java技术文章参见《Java开发笔记(序)章节目录》
Java开发笔记(八十二)注解的基本单元——元注解的更多相关文章
- Java开发笔记(十二)布尔变量论道与或非
在编程语言的设计之初,它们除了可以进行数学计算,还常常用于逻辑推理和条件判断.为了实现逻辑判断的功能,Java引入了一种布尔类型boolean,用来表示“真”和“假”.该类型的变量只允许两个取值,即t ...
- Java开发笔记(一百二十八)Swing的图标
前面提过,AWT没提供能够直接显示图像的控件,这无疑是个令人诟病的短板,因为一上来就得由程序员自己去定义新控件,对于初学者来讲很不友好.这个问题在Swing中也解决掉了,不过Swing并未提供单独的图 ...
- Java开发笔记(一百二十五)AWT图像加工
前面介绍了如何使用画笔工具Graphics绘制各种图案,然而Graphics并不完美,它的遗憾之处包括但不限于:1.不能设置背景颜色:2.虽然提供了平移功能,却未提供旋转功能与缩放功能:3.只能在控件 ...
- Java开发笔记(一百二十六)Swing的窗口
前面介绍了AWT界面编程的若干技术,在编码实践的时候,会发现AWT用起来甚是别扭,它的毛病包括但不限于下列几点:1.对中文的支持不好,要想在界面上正常显示汉字,还得在运行时指定额外的运行参数“-Dfi ...
- Java开发笔记(一百二十)AWT文本标签
前面介绍了AWT窗口及其面板的简单用法,其中展示出来的控件只有按钮一种,还有很多好用好玩的控件有待介绍.首先是文本标签Label,该控件用于显示一段平铺文本,它不花哨也不跳动,完全就是素面朝天的文本字 ...
- Java开发笔记(一百二十二)AWT选择框
前面介绍了两种文本输入框的用法,不过实际应用很少需要用户亲自文字,而是在界面上列出几个选项,让用户勾勾点点完成选择,这样既方便也不容易弄错.依据选择的唯一性,可将选项控件分为两类:一类是在方框中打勾的 ...
- Java开发笔记(一百二十四)AWT绘图操作
前面介绍了如何使用画笔在控件上展示图像,可是图像来源于磁盘图片,无法即兴绘制个性化的图案.所幸画笔工具Graphics不仅能够描绘图像,还支持绘制常见的几何形状,也支持绘制文本字符串,除了绘制图像用到 ...
- Java开发笔记(一百二十九)Swing的输入框
Swing的输入框仍然分成两类:单行输入框和多行输入框,但与AWT的同类控件相比,它们在若干细节上有所调整.首先说单行输入框,AWT的单行输入框名叫TextField,平时输入什么字符它便显示什么字符 ...
- Java开发笔记(九十二)文件通道的基本用法
前面介绍的各色流式IO在功能方面着实强大,处理文件的时候该具备的操作应有尽有,可流式IO在性能方面不尽如人意,它的设计原理使得实际运行效率偏低,为此从Java4开始增加了NIO技术,通过全新的架构体系 ...
随机推荐
- 安卓开发笔记(三十):自定义Button
在笔者本人看了很多博客和书之后,发现很少博主对于自定义控件能够进行一个比较全面的思路讲解,大多数都是只讲了一些细节,但并没有讲如何把代码进行整体的实现.因此这里讲讲整体的自定义button实现的详细过 ...
- ASP.NET Core 项目实战(持续更新~~~)
一.前言 准备写这个系列文章的设想开始于今年9月,毫无意外,期间又又又又拖了很长时间,文章主要是为了记录自己学习使用 ASP.NET Core Web API 与 Vue 创建一个前后端分离的项目的整 ...
- 在 EFCore 定义的实体中进行 FreeSql 开发
EFCore 和 FreeSql 都是 ORM,在各自领域都有着独特的优势. 问题起源 假设某项目是使用 EFCore 开发的,且实体 特性或FluentApi 都配置好了,如: protected ...
- C# 将object对象转换为实体对象
C# 将object对象转换为实体对象.一共两种方法. 第一种方法,代码如下: /// <summary> /// 将object对象转换为实体对象 /// </summary> ...
- 003-005:Java平台相关的面试题
本文首发于公众号:javaadu 003:字节码是什么? 在Java中,字节码存放于以.class结尾的二进制文件. 字节码之于Java,类似于汇编语言之于C/C++.对于C/C++语言来说,不同的平 ...
- idea配github
下面步骤的三个前提条件:安装git 安装idea 注册github账号 步骤一.绑定我的github账号与我的计算机 绑定我的github账号与我的计算机之后,便能很方便地上传或者更新我的代码,这需要 ...
- windows系统库
内部组件 这些程序库文件通常不会被程序直接使用,不过它们却是用来实现其他程序库功能的重要程序库. Hal.dll Windows系统的硬件抽象层就是由Hal.dll实现[1].HAL提供很多函数,而这 ...
- Exp5 Msf基础应用 20164312 马孝涛
1.本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器的攻击,如ms11_ ...
- 【RL-TCPnet网络教程】第39章 RL-TCPnet之TFTP服务器
第39章 RL-TCPnet之TFTP服务器 本章节为大家讲解RL-TCPnet的TFTP服务器应用,学习本章节前,务必要优先学习第38章的TFTP基础知识.有了这些基础知识之后,再搞本章节会 ...
- Flask python初期九九乘法表
from flask import Flask #导入 app = Flask(__name__) @app.route('/') def index(): res=" " ...