Annotation:
他是干嘛的?
他本身是一个接口类型,而大家所说的注解一般是这个接口的具体实现类。后文用"具体的注解"和"Annotation接口"来区分两者。
Annotation(后文称注解)作用于类,方法,变量,参数和包等代码。他可以在不改变源代码的基础上给所注解的代码加上一些类似"BUFF"的存在,让被注解的代码在编译阶段做出一些特别的事情。
他是怎么组成的?
每一个具体的注解一般有以下3部分:
-
接口--Annotation:所有注解的原始接口,有equals(),hashCode()、toString()、返回具体实现的子类类型的annotationType()方法。
-
枚举类型--ElementType:用来规定注解用在什么地方,一个具体的注解可以允许作用于多个地方,比如说:
-
TYPE:限定这个具体的注解写到类、接口或枚举声明上方。
-
FIELD:字段声明上方。
-
METHOD:方法声明上方。
-
PARAMETER:参数声明之前方。
-
等等
-
-
枚举类型--RetentionPolicy:用来说明这个注解活到什么时候,一个具体的注解必须活到一个确切的时间(除了在源码阶段以外在哪些地方能看到),你比如说:
-
SOURCE(只保留在源码中)
-
CLASS(可以让这个注解存储于对应的.class文件里面,是默认值。)、
-
RUNTIME(在CLASS的基础上让他在JVM也可以读入,也就是在运行的时候也能看见,存储在JVM的)。
-
怎么定义一个具体的注解?
@Inherited @Documented @Target(ElementType.FIELD,ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Annotation_Test { }
@interface是自定义注解所用到的一个注解。他的作用相当于Annotation_Test实现了Annotation接口。
这个注解类的上方也有注解,"难道注解还能给注解用?"不错,有些注解就是只能用来定义注解的。相当于在生活中给手机设置属性,这些属性项都有自己的默认值。
@Targe用于标识这个具体注解的作用。括号内参数表明是说这个注解类可以作用在属性(或字段)和方法上,括号内可以填多个参数。
@Retention用于标识这个具体注解的策略,括号内参数只能填一个参数,表明他能活多久。
@Documented让这个注解类能够写入javadoc中。
@Inherited让这个具体的注解类具有继承性。
他有哪些具体代表?
-
@Overrider:限定重写父类方法,该注释只能用于方法。
-
@Deprecated:用于表示某个程序元素(类,方法等)已过时。让编译器对注解代码在被调用时标记不可用,具体表现为划一道横线。
-
@SuppressWarings:指示编译器忽略注解中声明的警告。让编译器不要理会某些代码的警告。
上述三个注解是作用于代码上的,而以下是作用于注解的注解:
-
@Retention:标识这个注解怎么保存,是只在代码中,还是编入class文件,或者是在运行时可以通过反射访问。
-
Documented:标记这些注解是否包含在用户文档中。
-
Target:标记这个注解应该是哪种java成员。
-
Inherited:标记这个注解是继承于那个注解类(默认注解并没有继承于任何子类)
从Java7开始额外添加3个注解:
-
@SafeVarargs:忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
-
FunctionalInterface:标识一个匿名函数或函数式接口。
-
Repeatable:标识某注解可以在同一个声明上使用多次。