Java 注解(Annotation)又称 Java 标注
Java语言中的类、方法、变量、参数和包等都可以被标注。
和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容
Java定义了一套注解,共有七个,三个在java.lang中,四个在java.lang.annotation中。
由此看出:
每一个Annotation对象和Annotation的实现类,都会有唯一的RetentionPolicy属性,可以有若干个ElementType属性
package java.lang.annotation; public interface Annotation { boolean equals(Object obj); int hashCode(); String toString(); Class<? extends Annotation> annotationType(); }
Annotation就是个接口
package java.lang.annotation; public enum ElementType { /**标明该注解可以用于类、接口(包括注解类型)或enum声明*/ TYPE, /** 标明该注解可以用于字段(域)声明,包括enum实例 */ FIELD, /** 标明该注解可以用于方法声明 */ METHOD, /** 标明该注解可以用于参数声明 */ PARAMETER, /** 标明注解可以用于构造函数声明 */ CONSTRUCTOR, /** 标明注解可以用于局部变量声明 */ LOCAL_VARIABLE, /** 标明注解可以用于注解声明(应用于另一个注解上)*/ ANNOTATION_TYPE, /** 标明注解可以用于包声明 */ PACKAGE, /** * 标明注解可以用于类型参数声明(1.8新加入) * @since 1.8 */ TYPE_PARAMETER, /** * 类型使用声明(1.8新加入) * @since 1.8 */ TYPE_USE private ElementType() { } }
ElementType是enum枚举类型,它用来指定Annotation的类型
package java.lang.annotation; public enum RetentionPolicy { SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 */ CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */ RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */ }
RetentionPolicy是enum枚举类型,它用来指定Annotation的策略。通俗地说,不同RetentionPolicy类型的Annotation的作用域不同
@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation{ }
(1)@interface:使用@interface定义注解时意味着它实现了java.lang.annotation.Annotation接口,即该注解就是一个Annotation。
定义Annotation时,@interface是必须的。
注意:它和我们通常的implements实现接口不同,Annotation接口的实现细节都由编译器完成。通过@interface定义注解后,该注解不能继承其他的注解或接口。
原文:https://www.cnblogs.com/tang321/p/14594671.html