注解
元注解@Retention
指定注解保留时间。如果@Retention不存在,保留策略默认为RetentionPolicy.CLASS
RetentionPolicy.SOURCE | 注解被编绎器丢弃 |
---|---|
RetentionPolicy.CLASS | 注解被编绎器记录到class文件中,但不在运行时虚拟机中保留 |
RetentionPolicy.RUNTIME | 注解被编绎器记录到class文件中和在运行时虚拟机中保留,所以可以通过反射获取 |
@Target
指定注解可应用的上下文。如果@Target不存在,可用于所有类型
ElementType.TYPE 类、接口、注解、枚举声明
ElementType.FIELD 成员变量声明、枚举常量
ElementType.CONSTRUCTOR 构造方法声明
ElementType.METHOD 方法声明
ElementType.PARAMETER 形参声明
ElementType.LOCAL_VARIABLE 局部变量声明
ElementType.ANNOTATION_TYPE 注解声明
ElementType.PACKAGE 包声明
ElementType.TYPE_PARAMETER 类型参数声明
@Inherited
指定注解被自动继承。如果@Inherited存在,当用户去查找注解且本类声明无此注解,会去寻找父类的注解,重复此过程直至找到或到达类层级的顶部;如果仍找不到,说明无此注解。注解应用在类上时,@Inherited才有效
@Documented
指定注解的使用被javadoc记录到文档中。注意注解本身肯定在文档中
如
/**
* 注解会自动实现Annotation接口,但显性实现Annotation接口不是定义一个注解
* 注解不能定义任何方法
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@Documented
public @interface FirstAnnotation {
// 定义属性。如果没有指定默认值,使用时就必须指定该属性值
String value() default "helloworld";
String NAME = "zhansan";// 定义成员变量,默认也只能是public static final
}
使用注解
如果只给value属性赋值,属性名可以省略注解中如果属性是数组类型,赋单个值时会自动转成数组。如String[],直接赋字符串会自动转成字符串数组
可以用多个注解修饰同一个成分,文档注释放在注解的上面
如
public static void main(String[] args) throws Exception {
Class<Person> personClass = Person.class;
FirstAnnotation firstAnnotation = personClass.getAnnotation(FirstAnnotation.class);
System.out.println(firstAnnotation.value());//helloworld
System.out.println(FirstAnnotation.NAME);//zhansan
}
常用注解
@Override 确保方法是重写方法。如果方法不是重写方法,会报错
@SuppressWarnings 压制警告
all 压制所有警告
deprecation 压制反对使用警告
rawtypes 压制泛型警告
unchecked 压制未检查警告
unused 压制未使用警告
@Deprecated 表示方法不建议被使用