通过反射实现对象之间字段转换,字典转换

文章介绍了如何使用Java反射API,通过`ConvertColumn`接口实现源对象字段到目标对象的转换,包括处理字段名匹配、字典查找和值赋值的过程。
摘要由CSDN通过智能技术生成
 

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ConvertColumn {
    
    String field() default "";
    
    String dictKey() default "";
   
}
@SneakyThrows
    public static <T> void convert(T source, T target) {
        Class<?> targerClass = target.getClass();
        Field[] targerfields = targerClass.getDeclaredFields();
        Class<?> sourceClass = source.getClass();
        Field[] sourceFields = sourceClass.getDeclaredFields();
        for (Field targerfield : targerfields) {
            //设置允许通过反射访问私有变量
            targerfield.setAccessible(true);
            ConvertColumn annotation = targerfield.getAnnotation(ConvertColumn .class);
            if (annotation != null) {
                //获取对应字段名称
                String value = annotation.field();
                String dictKey = annotation.dictKey();
                if(StringUtil.isNotBlank(value)) {
                    for (Field sourceField : sourceFields) {
                        sourceField.setAccessible(true);
                        if (sourceField.getName().equals(value)) {
                            //获取当前字段数据
                            Object data = sourceField.get(source);
                            if (StringUtil.isNotBlank(dictKey)) {
                                String dictValue = findDictConver(dictKey, String.valueOf(data));
                                setPropertyVal(targerfield.getName(), target, dictValue);
                            } else {
                                setPropertyVal(targerfield.getName(), target, data);
                            }
                            break;
                        }
                    }
                }else{
                    //如果不存在字段转换,获取对应字典
                    if(StringUtil.isNotBlank(dictKey)){
                        Object data = targerfield.get(target);
                        String dictValue = findDictConver(dictKey, String.valueOf(data));
                        setPropertyVal(targerfield.getName(), target, dictValue);
                    }
                }
            }
        }
    }
    
    
    
    /**
     * 赋值数据
     * @param propertyName
     * @param target
     * @param data
     * @throws IntrospectionException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     */
    private static void setPropertyVal(String propertyName, Object target, Object data)
            throws IntrospectionException, IllegalAccessException, InvocationTargetException {
        PropertyDescriptor pd = new PropertyDescriptor(propertyName, target.getClass());
        Method setMethod = pd.getWriteMethod();
        setMethod.invoke(target, data);
    }
    
    /**
     * 查询字典转换数据
     * @param dictKey
     * @param dictValue
     * @return
     */
    private static String findDictConver(String dictKey, String dictValue) {
        return "暂时不查询字典";
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值