工作中遇到需要修改注解屬性值的場(chǎng)景,記錄下修改方法板甘。
// 默認(rèn) 字段 S_State 注解 isNotNull() 的值是 true(不能為空)党瓮,修改為 false(可以為空),以便通過validate校驗(yàn)
public static void main(String[] args) throws Exception {
BORfKnowledgeBaseBean bean = new BORfKnowledgeBaseBean();
bean.setTenantId(1000000000);
bean.setBaseCode("TEST_RULE_4");
bean.setBaseName("規(guī)則引擎測(cè)試4");
bean.setNotes("規(guī)則引擎測(cè)試4");
bean.setState("");// ~~State賦值為空字符串~~
bean.setRemarks("");
// 獲取BORfKnowledgeBaseBean的 S_State 字段所有屬性
Field field = bean.getClass().getDeclaredField("S_State");
// 獲取S_State字段上的ParamsAnn注解實(shí)例
ParamsAnn ann = field.getAnnotation(ParamsAnn.class);
// 獲取ParamsAnn注解實(shí)例的 isNotNull 屬性值
Object stateAnnValue = ann.isNotNull();
Object annValue = ann.isNotNull();
System.out.println("修改前....." + annValue);
// 獲取 ann 這個(gè)代理實(shí)例所持有的 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注解實(shí)例的 isNotNull 屬性值
annValue = ann.isNotNull();
System.out.println("修改后....." + annValue);
BeanHelper.validate(bean);
}
輸出結(jié)果:
修改前.....true
修改后.....false
可以看到修改后Bean中不能為空的State字段可以設(shè)定為空了虾啦。