Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
作用在代码上的注解:
- @Override 检查该方法是否为重写方法。若其父类,或是实现的接口中没有该方 法时,编译错误。
- @Deprecated 标记过时方法。若使用该方法,报编译警告。
- @SuppressWarnings 让编译器去忽略注解中声明的警告。
元注解(注解上的注解,即最基础的)4+3共7个:
- @Retention 标识该注解是保存在在代码中、.class文件中,在运行时可通过反射访问。
- @Documented 标记该注解是否包含在用户文档中。
- @Target 标记该注解的使用范围(类,接口,包等)。
- @Inherited 标记该注解继承于哪个注解类(默认没继承于任何子类)
- @SafeVarargs Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调 用产生的警告。
- @FunctionalInterface Java 8 开始支持,标识一个匿名函数或函数式接口。
- @Repeatable Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
Annotion架构
@Target 用于标记该注解的使用范围(类,接口,包等)。@Target可指定多个元素类型,中间用逗号隔开。
- ElementType.TYPE:表示该注解可应用到类、接口、枚举、注解类型等上。
- ElementType.FIELD:表示该注解可应用字段声明。
- ElementType.METHOD:表示该注解可应用到方法上。
- ElementType.PARAMETER:表示该注解可应用到方法参数上。
- ElementType.CONSTRUCTOR:表示该注解可应用到构造方法上。
- ElementType.LOCAL_VARIABLE:表示该注解可应用到局部变量上。
- ElementType.ANNOTATION_TYPE:表示该注解可应用到注解类型上。
- ElementType.PACKAGE:表示该注解可应用到包上。
@Retention用于表示该注解是保存在在代码中、.class文件中,还是到运行时
- RetentionPolicy.SOURCE:注解只保留在源文件,当.java文件编译成.class文件时,注解会被丢弃
- RetentionPolicy.CLASS:注解被保留到.class文件,jvm加载.class文件时候被丢弃,是默认的生命周期
- RetentionPolicy.RUNTIME:注解不仅被保存到.class文件中,jvm加载class文件之后还会存在
注解的作用
SOURCE ——》APT(Annotation Processor Tools) 用于生成额外的辅助类
//自定义标注,用于参数检查 public class build{ @buildinspect private static int mCurrentDay; enum Weekday{ SUNDAY, MONDAY } @InDef({Weekday.SUNDAY,Weekday.MONDAY}) //限定参数 @Target({ElementType.PARAMETER,ElementType.FIELD}) public @interface buildinspect { //自定义标注,用于参数检查 } public static void setDay(Weekday curday){mCurrentDay = curday}; public static void setDay(@buildinspect int curday){mCurrentDay = curday}; }
CLASS——》字节码增强,编译class文件后,判断是否注解实现修改代码的逻辑(插桩技术)
RUNTIME——》反射,通过反射技术动态获取注解与其元素,从而实现不容逻辑判定