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技术,通过全新的架构体系 ...
随机推荐
-
asp.netMVC4(基础知识----传值问题分析)
(1)一般在数据交互的时候,都会涉及到前后台间的相互传值,一般的情况下,方法也有多种,下面就后台定义变量往前台传值: 以下是后台代码: /// <summary> /// 展示举报信息 / ...
-
eclipse中字母大小写转换快捷键
ctrl+shift+x 转为大写 ctrl+shift+y 转为小写
-
ASP.NET MVC3细嚼慢咽---(1)网站创建与发布
这一节我们演示下怎样使用VS2010创建与发布MVC3建立的网站.使用VS2010创建MVC3.0网站,需要下载MVC3.0的安装包,这个大家可以去网络上下载. 1.项目创建 ...
-
H264 编解码框架简单介绍
阅读完H264/AVC 编解码器的介绍,脑海中仅仅是留下下面三条: 1.H264并没有明白规定一个编解码器怎样实现,仅仅是规定了一个编码后的视频比特流的句法,和该比特流的解码方法,这个与MPEG 类似 ...
-
freemarker常见语法大全
推荐freemarker系列教程:http://swiftlet.net/archives/category/freemarker FreeMarker的插值有如下两种类型:1,通用插值${expr} ...
-
Scala:数组
http://blog.csdn.net/pipisorry/article/details/52902432 ) 或var z = new Array[String](3) 以上语法中,z 声明一个 ...
-
算法竞赛之递归——输出1-n的所有排列
本文是博主原创文章,未经允许不得转载.我的csdn博客也同步发布了此文, 链接 https://blog.csdn.net/umbrellalalalala/article/details/79792 ...
-
centos 7修改时区
在线上环境遇到时间差八小时,怀疑是时区的原因: 然后再linux上运行: date 发现输出的是UTC时间,时间与现在差八个小时 然后通过以下命令去修改时区: ln -sf /usr/share/zo ...
-
从零开始学安全(二十二)●PHP日期date参数表
$date=new DateTime(); echo $date->format("Y-m-d h:i:s");
-
[SQLSERVER] [RESTORE] 逐步恢复日志备份并使用只读模式查看
执行: USE master GO RESTORE DATABASE MYDB FROM DISK = N'FULL_BACKUP.bak' WITH REPLACE, STANDBY = N'STA ...