Java注解
注解为在代码中添加信息提供了一种形式化的方式。Java SE5
内置了三种定义在 $java.lang$ 当中的注解:
- $@Override$ :表示当前定义的方法将覆盖超类中的方法;
- $@Deprecated$ :表示方法被弃用,调用此类方法将引发警告;
- $@SuppressWarnings$ :关闭某些编译警告信息。
除此之外还有四种注解,用于创建新注解。
1. 语法
1.1 定义
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
public int id();
public String description() default "no description";
}
注解的定义方式很像接口,也与接口一样会被编译为class
文件。定义注解需要一些元注解。$@Target$ 定义注解的作用对象,如方法;$@Retention$ 定义的可用级别,分为源码 ( $SOURCE$ )、类文件 ( $CLASS$ )、运行时 ( $RUNTIME$ )。
在定义注解时也可以设置一些元素表示一些值,不同于接口,你可以为这些值设置默认值。如果没有提供默认值,那么在使用注解的时候就必须进行赋值。没有元素的注解称为标记注解 ( $marker\ \ annotation$ )。可用的注解元素包括以下类型:
- 基本类型;
- $String$ ;
- $Class$ ;
- $enum$ ;
- $Annotation$ ;
- 以上类型的数组。
1.2 元注解
Java
内置了四种元注解:
- $@Targe$ :表示注解的作用对象,包括:
- $CONSTRUCTOR$ :构造器;
- $FIELD$ :域,包括 $enum$ 实例;
- $LOCAL_-VARIABLE$ :局部变量;
- $METHOD$ :方法;
- $PACKAGE$ :包;
- $PARAMETER$ :参数;
- $TYPE$ :类、接口(包括注解)和 $enum$ 声明;
- $@Retention$ :表示在什么级别保存注解信息,包括:
- $SOURCE$ :源码,注解将被编译器丢弃;
- $CLASS$ :
class
文件,注解将被JVM
丢弃; - $RUNTIME$ :运行时,因此可以通过反射获取注解信息;
- $@Documented$ :将此注解包含在
Javadoc
中; - $@Inherited$ :允许子类继承父类中的注解。
2. 注解处理
注解需要搭配注解处理器使用,可以通过反射机制创建自己的注解处理器。
public class TestTracker {
public static void trackTestMethod(Class<?> c) {
for (Method m : c.getDeclaredMethods()) {
Test t = m.getAnnotation(Test.class);
if (uc != null) {
System.out.println(
m.getName()
+ " use annotation @Test, id = "
+ t.id()
+ ", description"
+ t.description());
}
}
}
}
通过传入 $Class$ 对象,可以获取到类的方法和注解。