动态修改注解值

工作中遇到需要修改注解属性值的场景,记录下修改方法。

    // 默认 字段 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字段可以设定为空了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。