Java反射替换属性字段上注解属性对应的值

 /**
     * 设置ExcelProperty注解对应的value
     *
     * @param properties 属性字段和注解属性字段值 键值对
     * @tClass 泛型 那个类
     */
    public static  <T> void setHeaderValue(Properties properties,Class<?> tClass) {
    
    
        Assert.notNull(properties, "properties file must mot be null");
        if (properties.size() == 0) {
    
    
            return;
        }
        Set<Map.Entry<Object, Object>> entries = properties.entrySet();
        entries.forEach(entry -> {
    
    
            try {
    
    
                //属性名
                String key = String.valueOf(entry.getKey());
                if (StringUtils.isBlank(key)) {
    
    
                    return;
                }
                //属性值
                String value = String.valueOf(entry.getValue());
                if (StringUtils.isBlank(value)) {
    
    
                    return;
                }
                //反射找到字段
                Field displayName = tClass.getDeclaredField(key);
                //获取字段上的注解
                ExcelProperty annotation = displayName.getAnnotation(ExcelProperty.class);
                InvocationHandler h = Proxy.getInvocationHandler(annotation);
                // 获取 AnnotationInvocationHandler 的 memberValues 字段
                Field hField;
                hField = h.getClass().getDeclaredField("memberValues");
                // 因为这个字段是 private final 修饰,所以要打开权限
                hField.setAccessible(true);
                // 获取 memberValues

                Map memberValues = (Map) hField.get(h);
                // 修改 value 属性值
                memberValues.put("value", value.split(","));


            } catch (Exception e) {
    
    
                log.error("设置ExcelProperty对应value属性失败", e);
            }
        });


    }

猜你喜欢

转载自blog.csdn.net/niugang0920/article/details/110531039