作者:wr人在峡 | 来源:互联网 | 2023-09-18 21:12
维护老旧项目或基于旧项目开发新功能时,经常能发现各种各样的Bean类,其中往往会存在几个类似的Bean由于个别属性的不同而需要互相转化,需要对每种转化定义一个转化函数,代码维护效率很低,本方
维护老旧项目或基于旧项目开发新功能时,经常能发现各种各样的Bean类,其中往往会存在几个类似的Bean由于个别属性的不同而需要互相转化,需要对每种转化定义一个转化函数,代码维护效率很低,本方案可以实现通过对Bean中的属性添加注解,快速的进行2个Bean的转化。
下面先上代码:
public class BeanTransform {
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BeanProperty {
String value() default "";
}
/**
* Bean转化函数
* @param object 来源Bean对象
* @param clazz 目标Bean类
* @return 目标Bean对象
* @throws InstantiationException
* @throws IllegalAccessException
*/
public static Object transform(Object object, Class clazz) throws InstantiationException,IllegalAccessException {
if (object == null || clazz == null) return null;
Object result = clazz.newInstance();
Field[] scrFields = object.getClass().getDeclaredFields(); // 来源Bean类中的Field数组
Field[] desFields = clazz.getDeclaredFields(); // 目标Bean类中的Field数组
for (Field srcField : scrFields) { // 遍历来源Bean类中的Field数组,判断是否有BeanProperty注解
srcField.setAccessible(true);
if (srcField.isAnnotationPresent(BeanProperty.class)) {
BeanProperty srcAnt = srcField.getAnnotation(BeanProperty.class);// 取出BeanProperty注解
if (!srcAnt.value().equals("")) {
for (Field desField : desFields) { // 遍历目标Bean类中的Field数组,判断是否有BeanProperty注解
if (desField.isAnnotationPresent(BeanProperty.class)) {
BeanProperty desAnt = desField.getAnnotation(BeanProperty.class);// 取出BeanProperty注解
if (srcAnt.value().equals(desAnt.value())) {// 如果来源Bean和目标Bean的注解值相等,则操作赋值
desField.setAccessible(true);
if (srcField.getType().equals(desField.getType())) {
Object value = srcField.get(object);
desField.set(result, value);
} else {
Object values = transform(srcField.get(object), desField.getType());
desField.set(result, values);
}
desField.setAccessible(false);
break;
}
}
}
}
}
srcField.setAccessible(false);
}
return result;
}
}
首先定义注解类@interface
BeanProperty,值为字符串
转化函数先获取输入类和输出类的变量,然后根据变量的BeanProperty注解值进行转换,当BeanProperty注解值相同,则进行转化赋值
具体运用的代码如下:
public class JavaBean {
@BeanTransForm.BeanProperty("name")
public String value1;
@BeanTransForm.BeanProperty("value")
public String value2;
@Override
public String toString() {
return "{\n"
+ "\tvalue_1:" + value1
+ "\n\tvalue_2:" + value2
+ "\n}";
}
}
public class JavaBean2 {
@BeanTransForm.BeanProperty("name")
public String value1;
@BeanTransForm.BeanProperty("value")
public String value2;
@Override
public String toString() {
return "{\n"
+ "\tvalue_1:" + value1
+ "\n\tvalue_2:" + value2
+ "\n}";
}
}
public void test() {
JavaBean bean = new JavaBean();
bean.value1 = "abc";
bean.value2 = "efg";
Log.e("test", bean.toString());
JavaBean2 bean2 = null;
try {
bean2 = (JavaBean2) BeanTransForm.transform(bean, JavaBean2.class);
Log.e("test", bean2.toString());
} catch (Exception e) {
}
}
需要优化的点(暂时没做):
当
BeanProperty注解值想等时需要进行类型判断,如果是基本类型,根据基本类型的转化原则实现转化,如果不是基本类型,并且不能进行强转,需要再次递归调用转化函数,再根据变量属性的注解值进行转化