JDK内置的三个基本注解
1, @Override:限定重写父类方法,该注解只能用于方法
2, @Deprecated:用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险
3, @SuppressWarnings:抑制编译器警告
jdk提供的4种元注解
元注解:对现有的注解进行解释说明的注解
1,Retention(常用)
@Retention:只能用于修饰一个Annotation定义,用于指定该Annotation的生命周期,@Rentention包含一个RetentionPolicy类型的成员变量,使用@Rentention时,必须为该value成员变量指定值:
RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种政策的注解
RetentionPolicy.CLASS:在class文件中有效(即class保留),当运行Java程序时,JVM不会保留注解,这是默认值
RententionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行Java程序时,JVM会保留注释。程序可以通过反射获取该注释。
2,Target(常用)
@Target:用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量。
成员变量 | 描述 |
---|---|
CONSTRUCTOR | 用于描述构造器 |
FIELD | 用于描述域(属性) |
LOCAL_VARIABLE | 用于描述局部变量 |
METHOD | 用于描述方法 |
PACKAGE | 用于描述包 |
PARAMETER | 用于描述参数 |
TYPE | 用于描述类,接口(包括注解类型)或enum声明 |
3,Documented
@Documented:用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档。默认情况下,javadoc是不包括注解的。
注意: 定义为Documented的注解必须设置Retention值为RUNTIME。
4,Inherited
@Inherited:被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。
比如:如果把标有@Inherited注解的自定义的注解的自定义
- 可重复注解:@Repeatable
@Repeatable :jdk8中可重复注解,类型注解。使用注意:注解中的Target和Retention等要保持一致
- 类型注解
ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)
ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中
注解的应用如下
@Target({TYPE, METHOD, FIELD,PARAMETER,TYPE_PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Statuss {
Status[] value();
}
@Repeatable(Statuss.class)
@Target({TYPE, METHOD, FIELD,PARAMETER,TYPE_PARAMETER,TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Status {
String value() default "未付款";
}
注解的测试与校验
@Status(value = "付款")
@Status(value = "已付款")
class Person<@Status T>{
public static void main(String[] args) {
Class<@Status Person> personClass = Person.class;
Annotation[] annotations = personClass.getAnnotations();
for (Annotation annotation :annotations) {
System.out.println(annotation);
}
}
}