欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java开发笔记(八十二)注解的基本单元——元注解

程序员文章站 2022-07-11 09:17:47
Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义。前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的: 又如注解@FunctionalInterface,它的源码定义与之类似: 乍看过去,注解的定义竟与接口 ......

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开发笔记(序)章节目录