一. 使用注解
1. 含义
注解是放在类,方法,字段,参数前的一种特殊“注释”,是一种用作标注的“元数据”。
2. 三类注解
1)由编译器使用的注解,不会编译进.class文件,编译后扔掉;如:@Override、@SuppressWarnings。
2)由工具处理.class文件使用的注解,编译进.class文件,加载结束后不会加载进JVM,被底层库使用,无需处理。
3)程序运行期读取的注解,加载后一直存在于JVM中,最常用的注解。
3. 注意
1)注解配置参数必须都是常量,所以定义注解时就确定了所有参数的值,正常每个参数都有默认值,如果不设置就使用默认值。
2)如果参数名称是value且只有一个参数,那么可以省略参数名称。
二. 定义注解
1. 含义
用@interface来定义注解,注解的参数类似无参方法,用default设定一个默认值(最好是!),最常用的参数应命名为value(有且只有它时可以省略参数名称)。
2. 元注解(修饰其他注解)
1)@Target(最常用)
定义源码被应用于哪些位置。
ElementType.TYPE:类或接口或枚举
ElementType.FIELD:成员变量字段
ElementType.METHOD:方法
ElementType.CONSTRUCTOR:构造方法
ElementType.PARAMETER:方法参数
ElementType.LOCAL_VARIABLE:能修饰局部变量
ElementType.ANNOTATION_TYPE:能修饰注解
ElementType.PACKAGE:能修饰包
2)@Retention(默认CLASS期间)
定义了注解的生命周期
RetentionPolicy.SOURCE:编译期间
RetentionPolicy.CLASS:class文件
RetentionPolicy.RUNTIME:程序运行时(自定义常用!)
3)@Documented
是否将注解信息添加到javadoc文档中。
4)@Repeatable(注解可重复,不常用)
修饰的注解,可在同位置使用多个同样的注解。
5)@Inherited(继承)
修饰的注解,仅针对@Target(ElementType.TYPE)类型的类有效,子类可继承父类的注解。
3. 如何定义注解
1)使用@interface定义注解类。
2)添加参数、默认值;把最常用的参数定义为value(),所有参数都尽量设置默认值。
3)添加元注解;必须设置@Targer和@Retention,@Retention一般设置为RUNTIME。
三. 处理注解
1. 注意
1)所有注解都是class,都继承自java.lang.annotation.Annotation。
2)读取注解,要使用反射,反射API提供的Annotation实例封装了注解的所有信息。
2. 获取注解
1)判断某个注解是否存在于Class、Field、Method或Constructor。
Class.isAnnotationPresent(注解.Class)
Field.isAnnotationPresent(注解.Class)
Method.isAnnotationPresent(注解.Class)
Constructor.isAnnotationPresent(注解.Class)
2)用反射API获取注解
Class.getAnnotation(注解.Class)
Field.getAnnotation(注解.Class)
Method.getAnnotation(注解.Class)
Constructor.getAnnotation(注解.Class)
3. 使用注解
定义了注解,本身对逻辑程序没有任何影响,编写代码来使用注解,JVM不会自动给注解添加任何处理逻辑。