菜鸟教程写得更全面
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容,同时它也支持自定义 Java 标注。
内置的注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。从java7开始额外增加了三个注解。
元注解(作用在其他注解的注解)
@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
RetentionPolicy.SOURCE:表示该注解自会存在于代码阶段,编译时就会自动忽视
RetentionPolicy.CLASS:表示该注解只会存在于编译时,他不会被加载到JVM中
RetentionPolicy.RUNTIME:表示该注解可以保留到程序运行时,他会被加载到JVM中,所以在程序运行时可以获取到它们。
@Documented - 标记这些注解是否包含在用户文档(javadoc)中。
@Target - 标记这个注解应该是哪种 Java 成员。(这个注解作用的对象)
ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
ElementType.CONSTRUCTOR 可以给构造方法进行注解
ElementType.FIELD 可以给属性进行注解
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
ElementType.METHOD 可以给方法进行注解
ElementType.PACKAGE 可以给一个包进行注解
ElementType.PARAMETER 可以给一个方法内的参数进行注解
ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
比如说A使用了该注解,那么继承自A的B也默认会有此注解
@Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次
预置的注解(作用在代码的注解)
@Deprecated:用来标记已过时的元素
@Override:提示子类要重写父类的方法
@SuppressWarnings:可以忽略某种警告
@SafeVarargs:提醒开发者不要用参数做一些不安全的操作(不常用)
@Functionallnterface:函数时接口注解(不常用)
Annotation架构
"每 1 个 Annotation" 都与 "1 个 RetentionPolicy" 关联,并且与 "1~n 个 ElementType" 关联
(指定Annotation的策略--作用域) (指定Annotation类型)
Annotation.java
package java.lang.annotation;
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}
ElementType.java
package java.lang.annotation;
public enum ElementType {
TYPE, /* 类、接口(包括注释类型)或枚举声明 */
FIELD, /* 字段声明(包括枚举常量) */
METHOD, /* 方法声明 */
PARAMETER, /* 参数声明 */
CONSTRUCTOR, /* 构造方法声明 */
LOCAL_VARIABLE, /* 局部变量声明 */
ANNOTATION_TYPE, /* 注释类型声明 */
PACKAGE /* 包声明 */
}
RetentionPolicy.java
package java.lang.annotation;
public enum RetentionPolicy {
SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就被丢弃 */
CLASS, /* 编译器将Annotation存储于类对应的.class文件中,jvm会忽略它。默认行为 */
RUNTIME /* 编译器将Annotation存储于class文件中,JVM会读取它 */
}
自定义注解 @interface
类似于创建一个接口文件。
public @interface NewAnnotation {}
使用自定义的注解类型:
public class AnnotationTest {
@NewAnnotation
public static void main(String[] args) { }
}
示例
public @interface NewAnnotation {
String value();
}
public class AnnotationTest {
@NewAnnotation("mainmethod")
public static void main(String[] args) { }
@NewAnnotation(value="saymethod")
public static void saying(){}
}