注解

java知识点-注解

格式

元注解
public @interface 注解名称{
    属性列表;
}

本质

注解本质上就是一个接口,该接口默认继承Annotation接口
public interface TestAnnotation extends java.lang.annotation.Annotation {}
可通过
编译:javac 类全路径
反编译:javap class文件
得到确认

属性

要求:
    1.属性返回值类型有一下要求
        * 基本数据类型
        * String
        * 枚举
        * 注解
        * 以上类型的数组
        例:
            import java.util.concurrent.TimeUnit;
            public @interface TestAnnotation {
                int value();
                String value2();
                TimeUnit value3();
                Override value4();
                int[] value5();
                String[] value6();
                TimeUnit[] value7();
                Override[] value8();
            }

    2.定义属性,在使用时需要给属性赋值(属性名 = 返回值)
        例:
            public @interface TestAnnotation{
                int value();
            }
            使用
            @TestAnnotation(value = 1)
            public class TestClass{
            }

        1.如果只有一个属性需要赋值,并且属性名称为value,则value可以省略,直接定义值即可
            @TestAnnotation(1)
            public class TestClass{
            }

        2.如果定义属性时,用default关键字给属性默认初始化值,在使用时可不赋值
        例:
            public @interface TestAnnotation{
                int value() default 0;
            }
            使用
            @TestAnnotation()
            public class TestClass{
            }
        3.数组赋值时,使用{}包裹,如果数组只有一个值,则可以省略
        例:
            public @interface TestAnnotation{
                int[] value();
                String[] value2();
            }
            使用
            @TestAnnotation(value = 1, value2={"0", "1"})
            public class TestClass{
            }
        4.无属性可以直接使用
        例:
            public @interface TestAnnotation{
            }
            使用
            @TestAnnotation()
            public class TestClass{
            }

元注解,有四种类型

* @Target:描述注解能够作用的位置
    * ElementType取值:
        * TYPE:可以作用于类、接口、enum上
        * METHOD:可以作用于方法上
        * FIELD:可以作用于成员变量上
        * CONSTRUCTOR:构造器
        * LOCAL_VARIABLE:局部变量声明
        * PACKAGE:包声明
        * PARAMETER:参数声明

* @Repeatable:表示注解在同一位置可以出现多次   

* @Retention:描述注解被保留的阶段
    * @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
    * @Retention(RetentionPolicy.CLASS):当前被描述的注解,会保留到class字节码文件中,JVM无法读取到
    * @Retention(RetentionPolicy.SOURCE):当前被描述的注解,仅存在源码中

* @Documented:描述注解是否被抽取到api文档中

* @Inherited:描述在父类描述注解子类能否被继承,仅针对类,接口上声明并不会生效

提取注解

需要实现java.lang.reflect.AnnotatedElement接口才可提取

已知实现类
Class
Constructor
Field
Method
Package

获取方法
getAnnotation:返回指定类型的注解,不存在返回null
getAnnotations:返回存在的所有注解
isAnnotationPresent:判断是否包含指定类型的注解
getDeclaredAnnotations:返回直接存在于此元素上的所有注解