一.元注解:给注解来进行注解,是一种特殊的注解
有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种。
1. @Targrt :用来描述程序的使用范围
取值:
- ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
- ElementType.CONSTRUCTOR 可以给构造方法进行注解
- ElementType.FIELD 可以给属性进行注解
- ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
- ElementType.METHOD 可以给方法进行注解
- ElementType.PACKAGE 可以给一个包进行注解
- ElementType.PARAMETER 可以给一个方法内的参数进行注解
- ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
/*
* 则该注解只能用在方法前/包前
*/
@Target(value= {ElementType.METHOD,ElementType.PACKAGE})
public @interface myannotation {
//@interface是定义注解的关键字;在这里定义了一个名为myannotation的注解
}
2. @Retention :注解的存活时间
取值:
- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
3.@inherited 表示该注解可以被继承
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}
@Test
public class A {}
public class B extends A {}
注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。
4.@Repeatable 可重复设置值; 是1.8的新特性;
@interface Persons { //person容器注解:必须有一个名为value的对应数组
Person[] value();
}
@Repeatable(Persons.class) //代表person可重复;括号内为person的容器注解
@interface Person{
String role default "";
}
@Person(role="artist")
@Person(role="coder")
@Person(role="PM")
public class SuperMan{
}
!
二.注解的定义 使用
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
int id(); //以无参的方法定义注解属性;int为属性值类型,id为属性名称
String msg() default "Hi"; //default用来指定属性默认值
}
@TestAnnotation(id=3,msg="hello annotation") //使用自定义属性
public class Test {
}
1.如果注解中只有一个名为value的属性,使用注解时可以直接在括号内指定其值。
2.如果注解不含属性,则使用时可以省略括号
三.java中的预置注解
@Deprecated 用来标记过时元素