自定义注解与反射

3 阅读1分钟

 1、自定义注解

注解的作用是标记,用于在方法、字段、类等内容上标记,使用时用反射进行获取

创建注解

@Target(ElementType.FIELD) // 注解只能用于字段
@Retention(RetentionPolicy.RUNTIME) // 运行时可通过反射获取
public @interface CommonAnnotation {

    String value() default ""; 

}

标记目标

ElementType.TYPE - 类、接口、注解、枚举
ElementType.FIELD - 字段声明(实例变量、静态变量、常量)
ElementType.METHOD - 方法声明(实例方法、静态方法 、抽象方法)
ElementType.CONSTRUCTOR - 构造方法声明。
ElementType.PARAMETER - 方法或构造方法的参数声明。
ElementType.ANNOTATION_TYPE - 注解类型声明(即定义注解本身的元素)。
ElementType.PACKAGE - 包声明。
ElementType.LOCAL_VARIABLE - 局部变量声明。
ElementType.TYPE_PARAMETER - Java 8 之后支持,用于标记类型参数(泛型)。
ElementType.TYPE_USE - Java 8 之后支持,这是一种更广泛的类型使用上下文,可以用于: 类、接口、注解、枚举的类型使用(如 List<@NotNullString>),方法、构造方法、字段、局部变量、参数的类型使用。

多标记目标采用

@Target({ElementType.FIELD, ElementType.CONSTRUCTO

注解保留策略
SOURCE:注解只保留在源代码中,编译后丢弃。
CLASS:注解保留在字节码文件中,加载后丢弃。
RUNTIME:注解保留在字节码和运行时,可通过反射访问(常用)。

使用方法

    Class<?> clazz = obj.getClass();
    for (Field field : clazz.getDeclaredFields()) {
        if (field.isAnnotationPresent(CommonAnnotation.class)) {
            CommonAnnotation commonAnnotation = field.getAnnotation(CommonAnnotation.class);
        }
    }

使用isAnnotationPresent判断是否存在该枚举,使用getAnnotation获取,使用getDeclaredFields获取所有字段