反射修改pojo对象注解中的value值

文章介绍了如何在Java中通过反射机制改变注解的属性值,如`@ExcelProperty`和`@ColumnWidth`,并提供了一个具体示例,展示了如何动态修改字段的`value`属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体实现:

 /**
     * 变更注解的属性值
     *
     * @param variableName  属性名称
     * @param clazz     注解所在的实体类
     * @param tClass    注解类
     * @param filedName 要修改的注解属性名
     * @param value     要设置的属性值
     */
    public static <A extends Annotation> Class<?> changeAnnotationValue(String variableName,Class<?> clazz, Class<A> tClass, String filedName, Object value) {
        try {
            // 返回所有的属性
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                //根据字段名称修改相应属性值
                if (field.getName().equals(variableName)){
                    A annotation = field.getAnnotation(tClass);
                    setAnnotationValue(annotation, filedName, value);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return clazz;
    }
/**
     * 设置注解中的字段值
     *
     * @param annotation   要修改的注解实例
     * @param fieldName    要修改的注解属性名
     * @param value        要设置的属性值
     */
    public static void setAnnotationValue( Annotation annotation, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
        InvocationHandler handler = Proxy.getInvocationHandler(annotation);
        Field field = handler.getClass().getDeclaredField("memberValues");
        //允许访问私有变量
        field.setAccessible(true);
        // 获取 memberValues
        Map memberValues = (Map) field.get(handler);
        // 修改 value 属性值
        memberValues.put(fieldName, value);
    }

具体应用

待修改字段:

    // 序号
    @ExcelProperty(value = {"序号"} )
    @ColumnWidth(30)
    private String serialNumber;

执行修改方法修改字段value属性:

 //反射修改表头数据
        String[] strs = new String[]{"工程名称:"+form.getProjectName(),"序号"};
        Util.changeAnnotationValue("serialNumber",POJO.class, ExcelProperty.class,"value",strs);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值