java复制bean

来源:互联网 发布:java多线程编程 方腾飞 编辑:程序博客网 时间:2024/05/14 07:19

基本思想就是利用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));        
    }


感觉上面的实现还有很多可以优化的地方,大家可以根据实际需要修改为静态方法之类的。

0 0