我有5个web服务,A,B,C,D和E.每个都有自动生成的对象,结构完全相同,但名称不同,包装不同。
com.ws.a.carA contains parameters and com.ws.a.wheelA
com.ws.b.carB contains parameters and com.ws.b.wheelB
com.ws.c.carC contains parameters and com.ws.c.wheelC
com.ws.d.carD contains parameters and com.ws.d.wheelD
com.ws.e.carE contains parameters and com.ws.e.wheelE
我想创建一个函数,可以将每个对象(和内轮)转换为名为
的对象com.model.car,
但我不会有很多功能:
com.model.car convert(com.ws.a.objA obj)
com.model.car convert(com.ws.b.objB obj)
...
问题是,我无法为所有对象提供实现的通用接口,因为我不想手动更改自动生成的类(它们经常被重新创建)。
我需要一种方法,可能用泛型来创建一个共同的功能
com.model.car convert(T obj)
适用于所有车型,但我不确定如何实施。
答案 0 :(得分:4)
您可以使用反射。最简单,最干净的方法可能是使用Apache Common BeanUtils,PropertyUtils#copyProperties或BeanUtils#copyProperties。
PropertyUtils #copyProperties将值从一个对象复制到另一个对象,其中字段名称相同。因此,对于copyProperties(dest,orig),它会为两个对象中存在的所有字段调用dest.setFoo(orig.getFoo())。
BeanUtils #copyProperties也是这样做的,但你可以注册转换器,以便在必要时将值从String转换为Int。有许多标准转换器,但你可以注册自己的,在你的情况下com.ws.a.wheelA到com.model.wheel,或其他什么。
答案 1 :(得分:2)
您还可以查看Dozer
答案 2 :(得分:0)
我认为你应该考虑使用reflection。
答案 3 :(得分:0)
使用commons beanutils库可以执行以下实用程序类:
public class BeanUtilCopy {
private static BeanUtilsBean beanUtilsBean;
private static ConvertUtilsBean convertUtilsBean = new ConvertUtilsBean();
static {
convertUtilsBean.register(new Converter() { //2
public <T> T convert(Class<T> type, Object value) {
T dest = null;
try {
dest = type.newInstance();
BeanUtils.copyProperties(dest, value);
} catch (Exception e) {
e.printStackTrace();
}
return dest;
}
}, Wheel.class);
beanUtilsBean = new BeanUtilsBean(convertUtilsBean);
}
public static void copyBean(Object dest, Object orig) throws Exception {
beanUtilsBean.copyProperties(dest, orig); //1
}
当(1)beanUtilsBean使用转换器(2)将Wheel ** X **值传递给目标bean中的Wheel时。
使用示例:
CarB carB = new CarB();
carB.setName("car B name");
carB.setWeight(115);
WheelB wheelB = new WheelB();
wheelB.setName("wheel B name");
wheelB.setType(05);
carB.setWheel(wheelB);
Car car1 = new Car();
BeanUtilCopy.copyBean(car1, carB);
System.out.println(car1.getName());
System.out.println(car1.getWeight());
System.out.println(car1.getWheel().getName());
System.out.println(car1.getWheel().getType());
输出:
车B名称
115
轮B名称
5