创建注解和创建接口有点类似,都用了interface 不过注解的interface前面多了一个@,另外它还有连个元注解,@Target和@Retention,这两个注解专门用于定义注解本身。@Target表示注解的目标,ElementType.METHOD表示的是一个枚举 可选的值有:
public enum ElementType {
TYPE, 表示类或者接口 或者枚举声明
FIELD, 字段 包括枚举常量
METHOD, 方法
PARAMETER, 方法中的参数
CONSTRUCTOR, 构造方法
LOCAL_VARIABLE, 本地变量
ANNOTATION_TYPE,
PACKAGE,
TYPE_PARAMETER,
TYPE_USE
}
目标可以有很多个,用{}表示
@Target({ElementType.TYPE,ElementType.LOCAL_VARIABLE,ElementType.METHOD})
@Retention表示注解信息保留到什么时候,取值只能有一个。类型是RetentionPolice,它是一个枚举,有三个取值:
public enum RetentionPolicy {
SOURCE, //只在源代码中保留,编译器将代码翻译成字节码以后,文件就回丢掉
CLASS, //保留到字节码文件中,但java虚拟机将class文件加载到内存时不一定会在内存中保留
RUNTIME //一直保留到运行时
}
**如果retention没有声明的话,默认是class
如果是给编译器使用,所以@Retention都是Retention.Source
@Documented表示注解信息包含到生成的文档中
注解是不能被继承的,不过注解有一个和继承有关的注解@Inherited
public class Demo001 {
@Inherited
@Retention(RetentionPolicy.RUNTIME)
static @interface Test{
}
@Test
static class BaseClass{
}
static class children extends BaseClass{
}
public static void main(String[] args) {
System.out.println(children.class.isAnnotationPresent(Test.class));
}
}
打印结果:
true
如果去掉注解@Inherited,打印结果:
false
Test是一个注解,BaseClass有这个注解,children继承了baseClass,main方法是检测children是否有test注解。输出为true表示有,false表示没有