在Java中注解包含两部分:注解的定义和注解处理器。本篇只总结部分知识点,某些知识点不在其中,如需请自行阅读相关资料。
1、注解的定义
我们通过@interface定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName(){
public int value() default -1;
}
通过@Target、@Retention等元注解,对自定义的注解进行注解。
a)元注解
元注解专职负责注解其他的注解,也就是所谓的注解的注解。元注解包括如下四种:@Target、@Retention、@Document、@Inherited。
@Target:表示该注解可以用于什么地方,可以指定其中一个或者以逗号分隔的形式指定多个值,如果想将注解应用于所有的ElementType,那么可以省略该元注解,不过这种情况并不常见。有如下几种:
CONSTRUCTOR:构造器的声明
FIELD:域声明
LOCAL_VARIABLE:局部变量声明
METHOD:方法的声明
PACKAGE:包的声明
PARAMETER:参数声明
TYPE:类、接口(包括注解类型)或enum声明
@Retention:表示需要在什么级别保存注解信息。有如下几种:
SOURCE:注解将被编译器丢弃;注解信息存于源文件中。
CLASS:注解在class文件中可用,但会被JVM丢弃。
RUNTIME:VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息。
@Document:将此注解包含在JavaDoc中。
@Inherited:允许子类继承父类中的注解。
在多数的情况下,程序员主要是定义自己的注解,并编写自己的处理器来处理它们。
b)注解处理器
编写注解处理器有两种方式:
i)利用反射几种;
ii)利用Java提供的APT;
c)注解元素支持的数据类型
*所有的基本类型;
*String;
*Class;
*enum;
*Annotation;
*以上类型的数组;
如果你使用了其他类型,编译器就会报错。我们看到Annotation也是注解元素支持的数据类型,这说明注解是可以嵌套的。
d)注解元素的默认值限制
首先,必须是确定的值;其次对于非基本类型的元素,不能以null作为其值;