点击进入我的博客
注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。
1 注解语法
1.1 Java内置注解
- @Override:表示当前的方法定义将覆盖超类中的方法
- @Deprecated:表示方法或类已经不再建议使用
- @SuppressWarnings:关闭不当的编译器警告信息
@SuppressWarnings的关键词
关键词 | 用途 |
---|---|
all | to suppress all warnings |
boxing | to suppress warnings relative to boxing/unboxing operations |
cast | to suppress warnings relative to cast operations |
dep-ann | to suppress warnings relative to deprecated annotation |
deprecation | to suppress warnings relative to deprecation |
fallthrough | to suppress warnings relative to missing breaks in switch statements |
finally | to suppress warnings relative to finally block that don’t return |
hiding | to suppress warnings relative to locals that hide variable |
incomplete-switch | to suppress warnings relative to missing entries in a switch statement (enum case) |
nls | to suppress warnings relative to non-nls string literals |
null | to suppress warnings relative to null analysis |
rawtypes | to suppress warnings relative to un-specific types when using generics on class params |
restriction | to suppress warnings relative to usage of discouraged or forbidden references |
serial | to suppress warnings relative to missing serialVersionUID field for a serializable class |
static-access | o suppress warnings relative to incorrect static access |
synthetic-access | to suppress warnings relative to unoptimized access from inner classes |
unchecked | to suppress warnings relative to unchecked operations |
unqualified-field-access | to suppress warnings relative to field access unqualified |
unused | to suppress warnings relative to unused code |
1.2 定义注解
注解的定义和接口类似,只是要加一个@来表示这是一个注解。
@interface MyAnno {
String value() default "";
}
// 注解嵌套
@interface Anno {
MyAnno name() default @MyAnno;
}
注解中的元素
注解中的元素只能有以下几种类型:
- String
- 所有基本类型(不能用基本类型的包装类)
- Class
- enum
- Annotation
- 以上所有类型的数组
默认值的限制
- 元素不能有不确定的值,要么有默认值,要么使用注解时提供元素的值
- 对于非基本类型的元素,不能使用
null
为其值
注解不能继承
不能使用extends来继承某个@interface。
元注解
元注解负责注解其他的注解,共有四个:
- @Target:表示该注解可以用于什么地方,可能的ElementType参数包括:CONSTRUCTOR(构造器的声明)、FIELD(域声明、enum实例)、LOCAL_VARIABLE(局部变量声明)、METHOD(方法声明)、PACKAGE(包声明)、PARAMETER(参数声明)、TYPE(类、接口、注解类型、enum声明)
- @Retention:表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:SOURCE(注解将被编译器丢弃)、CLASS(注解在class文件中可用,但会被JVM丢弃)、
RUNTIME(JVM将在运行也保留注解,因此可以通过反射机制读取注解的信息) - @Document:将此注解包含在Javadoc中
- @Inherited:允许子类继承父类中的注解
- @Repeatable:可重复注解的注解,允许在同一申明类型(类,属性,或方法)的多次使用同一个注解。在这个注解出现前,一个位置要想注两个相同的注解,是不可能的,编译会出错误。
- @Native:仅仅用来标记native的属性,只对属性有效,且只在代码中使用,一般用于给IDE工具做提示用。
2 注解处理器
单纯定义一个注解是没有用的,需要配合注解处理器来处理标注了注解信息。
2.1 从类中提取注解
获取注解的相关操作都在java.lang.reflect
包下,即通过反射来获取注解信息。
@MyAnno(value = "Lucas")
public class Main {
public static void main(String[] args) {
MyAnno myAnno = Main.class.getAnnotation(MyAnno.class);
System.out.println(myAnno.value());
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
String value() default "";
}
2.2 AnnotatedElement接口
该接口提供了获取注解信息的多个方法,Field、Constructor、Method都是其子类。
网友评论