基本思想就是利用java反射机制获得beans中的setter和getter方法,当发现两者属性名一致时就调用方法,获得和设置值,前提,两个bean对象必须属性名和类型一致,而且实现了getter和setter方法。
public class BeanCopyer {
private static BeanCopyer beanCopyer = new BeanCopyer();
private Object resource;
private Object destination;
private BeanCopyer() {
}
/**
*
* 方法说明:生成实例
*
* Author: czh Create Date: 2016-3-29 下午02:23:47 History: 2016-3-29
* 下午02:23:47 Administrator Created.
*
* @param from
* @param to
* @return
*
*/
public static BeanCopyer created(Object from, Object to) {
beanCopyer.resource = from; // 目标
beanCopyer.destination = to; // 目的
return beanCopyer;
}
/**
*
* 方法说明:
*
* Author: czh Create Date: 2016-3-29 下午04:40:32 History: 2016-3-29
* 下午04:40:32 Administrator Created.
*
* @throws InvocationTargetException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*
*
*/
public void copy() throws IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
Method[] methods = resource.getClass().getMethods();
Method[] methodsTo = destination.getClass().getMethods();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().startsWith("get")) { // 通过getXX和setXX来复制
String property = methods[i].getName().substring(3); // 目标bean的属性名,比如getName的Name
for (int j = 0; j < methodsTo.length; j++) {
// 找到目标class对应的setter方法
if (methodsTo[j].getName().startsWith("set")
&& methodsTo[j].getName().substring(3).equals(property)) {
Object[] objs2 = new Object[1];
objs2[0] = methods[i].invoke(resource, new Object[0]); // 从目标bean中执行方法,得到返回值
methodsTo[j].invoke(destination, objs2); // 设置返回值至目的bean中
break;
}
}
}
}
}
}
使用示例:
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
User user1 = new User(); //目标
user1.setAge(25);
user1.setName("cz");
User user2 = new User(); //目的 同一个类
Student student = new Student(); //目的,不是同一个类
BeanCopyer copyer = BeanCopyer.created(user1, user2); //第一个复制
copyer.copy();
BeanCopyer copyerD = BeanCopyer.created(user1, student); //第二个复制
copyerD.copy();
System.out.println(user2.getAge() + ":" + user2.getName());
System.out.println(student.getAge() + ":" + student.getName() + ":" + student.getNumber());
System.out.println("abc123456".substring(3));
}
感觉上面的实现还有很多可以优化的地方,大家可以根据实际需要修改为静态方法之类的。