您的位置:首页 > 编程语言 > Java开发

java复制bean

2016-03-30 14:30 190 查看
基本思想就是利用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));

}

感觉上面的实现还有很多可以优化的地方,大家可以根据实际需要修改为静态方法之类的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: