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获取所有字段