注解定义
注解自jdk1.5引入,在程序中作为元数据,对程序项如类、方法、属性、参数等做标注接受作用,可以由编译工具解析,或者在执行时通过反射解析,以对程序做运行时的动态调整。
java内置注解
- @Override
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
这个注解应该都很熟悉,用于指明当前方法是重写了父类中的相应方法,如果某个方法上加了这个注解,而父类中又没有该方法,则编译器会报错。
-
@Deprecated
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) public @interface Deprecated { }
这个注解指明当前方法或属性或者类等已经过时,不推荐再继续使用,通常调用该注解修饰的方法会带中划线表示。
-
@SuppressWarnings
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { String[] value(); }
该注解指定忽略某系编译器警告,其中value为忽略的警告的名称,只能有一个值。
元注解
元注解指修饰注解的注解,java定义了4种特殊的注解,用于定义注解时使用,具体如下
- @Retention
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); }
此注解指定被修饰的注解的保留策略,值有三种,分别为SOURCE(源码种保留,编译后清除), CLASS(class文件中保留,运行时清除), RUNTIME(运行时保留,可通过反射获取),具体定义在以下枚举文件中
public enum RetentionPolicy { /** * Annotations are to be discarded by the compiler. */ SOURCE, /** * Annotations are to be recorded in the class file by the compiler * but need not be retained by the VM at run time. This is the default * behavior. */ CLASS, /** * Annotations are to be recorded in the class file by the compiler and * retained by the VM at run time, so they may be read reflectively. * * @see java.lang.reflect.AnnotatedElement */ RUNTIME }
-
@Target
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); }
此注解指定注解修饰的对象类型,其值定义在如下枚举类中
public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field declaration (includes enum constants) */ FIELD, /** Method declaration */ METHOD, /** Formal parameter declaration */ PARAMETER, /** Constructor declaration */ CONSTRUCTOR, /** Local variable declaration */ LOCAL_VARIABLE, /** Annotation type declaration */ ANNOTATION_TYPE, /** Package declaration */ PACKAGE, /** * Type parameter declaration * * @since 1.8 */ TYPE_PARAMETER, /** * Use of a type * * @since 1.8 */ TYPE_USE }
根据枚举元素的字面意思应该都能理解其代表的类型,该值可以是多个,用逗号分隔开。
-
@Inherited
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Inherited { }
指定子类可以继承父类的注解,默认情况子类的方法、属性等不会继承父类的。被该注解修饰的注解,用于修饰方法时,子类中该方法也带有此注解。该注解没有值。
-
@Documented
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { }
该注解修饰的元素可以被Javadoc等工具文档化。
自定义注解
从上面元注解的定义方式就可以看出自定义注解的方式,关键字为@interface,接着是注解名,{}中是该注解的值,定义方法与接口中定义方法的方式类似:类型 属性名() default 默认值。
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.Method)
public @interface Test{
String value() default "test";
}
其中,@Rentention和@Target元注解必须有,@Documented和@Inherited可选,值如果只有一个应取名为value,如果没有默认值,则default可以以省略。如上定义的注解可以用于修饰方法,运行时可以使用反射获取。
自定义注解应配合注解处理器使用,没有注解处理器,注解将没有任何意义,后续会另开篇幅讲解注解处理器。