2021-06-14_Java 注解(Annotation)

2021-06-13  本文已影响0人  微笑碧落

0.前言

1.注解类的声明

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation1 {
    String editor() default "TextFieldTableCell";
    String[] optionalValue() default {""};
    RetentionPolicy value();
}
package java.lang.annotation;
public enum RetentionPolicy {
    SOURCE,            /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了  */
    CLASS,             /* 编译器将Annotation存储于类对应的.class文件中。默认行为  */
    RUNTIME            /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}
package java.lang.annotation;
public enum ElementType {
    TYPE,               /* 类、接口(包括注释类型)或枚举声明  */
    FIELD,              /* 字段声明(包括枚举常量)  */
    METHOD,             /* 方法声明  */
    PARAMETER,          /* 参数声明  */
    CONSTRUCTOR,        /* 构造方法声明  */
    LOCAL_VARIABLE,     /* 局部变量声明  */
    ANNOTATION_TYPE,    /* 注释类型声明  */
    PACKAGE             /* 包声明  */
}

2.注解类的使用

@Entity
@Table(name = "missions")
@TableIncludeIndexColumn(name = "序号")
@Convert(converter = StringPropertyConvertor.class)
public class Mission {
    @Id
    @Column(name = "id")
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid")
    private String id;

     @ColumnDescribe(name = "停电类型", index = 3, editor = "ComboBoxTableCell", optionalValue = {"停电","不停电","带电"})
    @Convert(converter = StringPropertyConvertor.class)
    private StringProperty missionDate;
}

3. 通过反射获取一个元素的注解

Class theClass = Class.forName("homework01.User");
Class missionClass = Mission.class;
boolean hasAnn = theClass.isAnnotationPresent(MyAnnotation.class)

//获取一个注解对象
MyAnnotation myAnn = theClass.getAnnotation(MyAnnotation.class);

//获取全部类方法,并通过是否有注解来筛选
Arrays.stream(modelClass.getDeclaredFields())
                .filter(field -> field.getAnnotation(ColumnDescribe.class) != null)

4. 动态修改注解值

ColumnDescribe annotation = Mission.class.getDeclaredField("missionType").getAnnotation(ColumnDescribe.class);
System.out.println("修改前:" + annotation.index());

InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);

Field value = invocationHandler.getClass().getDeclaredField("memberValues");
value.setAccessible(true);
Map<String, Object> memberValues = (Map<String, Object>) value.get(invocationHandler);
memberValues.put("index",999);
System.out.println("修改后:" +annotation.index());

参考文章

1.Java 注解(Annotation)
2.反射机制获取一个类的注解
3.[Java] 通过反射,动态修改注解的某个属性值

上一篇 下一篇

猜你喜欢

热点阅读