工作中遇到需要修改注解属性值的场景,记录下修改方法。
// 默认 字段 S_State 注解 isNotNull() 的值是 true(不能为空),修改为 false(可以为空),以便通过validate校验
public static void main(String[] args) throws Exception {
BORfKnowledgeBaseBean bean = new BORfKnowledgeBaseBean();
bean.setTenantId(1000000000);
bean.setBaseCode("TEST_RULE_4");
bean.setBaseName("规则引擎测试4");
bean.setNotes("规则引擎测试4");
bean.setState("");// ~~State赋值为空字符串~~
bean.setRemarks("");
// 获取BORfKnowledgeBaseBean的 S_State 字段所有属性
Field field = bean.getClass().getDeclaredField("S_State");
// 获取S_State字段上的ParamsAnn注解实例
ParamsAnn ann = field.getAnnotation(ParamsAnn.class);
// 获取ParamsAnn注解实例的 isNotNull 属性值
Object stateAnnValue = ann.isNotNull();
Object annValue = ann.isNotNull();
System.out.println("修改前....." + annValue);
// 获取 ann 这个代理实例所持有的 InvocationHandler
InvocationHandler invocationHandler = Proxy.getInvocationHandler(ann);
// 获取 AnnotationInvocationHandler 的 memberValues 字段
Field hField = invocationHandler.getClass().getDeclaredField("memberValues");
hField.setAccessible(true);
Map<String, Object> memberValues = (Map<String, Object>) hField.get(invocationHandler);
memberValues.put("isNotNull", true);
// 获取ParamsAnn注解实例的 isNotNull 属性值
annValue = ann.isNotNull();
System.out.println("修改后....." + annValue);
BeanHelper.validate(bean);
}
输出结果:
修改前.....true
修改后.....false
可以看到修改后Bean中不能为空的State字段可以设定为空了。