预定义注解与自定义注解及其使用
注解的定义
注解本质上为一类特殊的接口,与普通接口不通的是在关键字interface前存在*@*符号。应注意的是interface、**@**是不同的标识符,虽然不推荐,但是两字符可以被空格字符分隔。
//推荐
@interface A{}
//不推荐但合法
@ interface B{}
//不推荐但合法
@ interface C{}
注解分类
内置于JDK中的预定义注解
- 以下为一些预定义注解:
- @Target 元注解(注解的注解)用于指定其他注解可作用的组件范围,其取值来自于java.lang.annotation.ElementType
- MODULE 为JDK9新增,用于修饰模块
- PACKAGE 用于修饰包
- TYPE 用于修饰类、接口(注解)、枚举
- ANNOTATION_TYPE 专用于修饰注解类型
- METHOD 用于修饰方法
- CONSTRUCTOR 用于修饰构造函数
- TYPE_PARAMETER 用于修饰参数化(类、接口、方法、构造器)
- FIELD 用于修饰成员变量(包含枚举常量)
- PARAMETER 用于修饰形式参数
- LOCAL_VARIABLE 用于修饰局部变量
- TYPE_USE 可用于使用extends、implements、throws子句、方法的返回值类型、强制类型转换操作符内等共计16种,详见JLS§4.11
- @Retention 元注解,用于指示编译器、JVM对于注解的保留策略的注解。缺省情况下,为保留至字节码文件。其余可选分别为源代码级别、运行时级别
- @Inherited 被该注解修饰的注解类型T所注解的类C,其子类可继承注解T,此规则对接口不适用
- 其余的诸如*@Override* 用于提供对于重写可能导致问题的早期检查、@FunctionalInterface 用于声明一个类为函数式接口…
- @Target 元注解(注解的注解)用于指定其他注解可作用的组件范围,其取值来自于java.lang.annotation.ElementType
位于JDK之外的自定义注解
-
注解区别于一般的接口,只是interface关键字前添加*@*标示符,即可完成自定义注解,依据使用目的的不同,可通过给自定义注解添加元注解的方法动态调整。
例如需要在程序运行时动态解析,获取注解信息需添加*@Retention(RetentionPolicy.RUNTIME)*,需要限定注解作用范围是可使用@Target
//如下注解,可在运行时通过JDK动态获取注解信息,且同时可作用于注解、构造器上 @Target(ElementType.ANNOTATION_TYPE) @Retention(RetentionPolicy.RUNTIME) public @ interface TU { }
注解的特殊性
-
除以下说明外,适用于接口的规则,同样适用于注解
-
注解中的方法签名无法指定参数、无法指定参数化类型、无法抛出异常,但方法返回值允许出现参数化类型
-
注解中的方法也不能被default、static修饰
-
注解均继承了java.lang.annotation.Annotation中的方法
-
接口中的方法返回值,只能为以下类型:
原生数据类型(byte,short,char,int,long,float,double,boolean)
String
Class
枚举类型
注解类型
或有上述组件元素构成的一维数组类型
-
请注意注解中方法的返回值不允许出现循环应用或引用自身的情况
-
方法可通过default指定默认值:
interface Formatter { enum Level { BAD, INDIFFERENT, GOOD } } @interface PrettyPrinter { Class<? extends Formatter> value() default Formatter.class; }
-