将一个Java对象复制到另一个

时间:2014-04-24 20:29:40

标签: java object copy javabeans pojo

将类的一个Java对象复制到同一个类的另一个对象的最佳方法是什么?我尝试了BeanUtil.copyProperties,但由于某种原因它没有用。这个班是一个复杂的班级。 (类包含另一个类对象等)

我的目标是通过休眠函数

按顺序填充值
Public Response getOrder(Order order, Ticket ticket) {

order = OrderManager.getOrderByTicket(ticket); //Hibernate function This doesn't work, order object gets a new reference

}

尝试这样做

Public Response getOrder(Order order, Ticket ticket) {

Order temp = OrderManager.getOrderbByTicket(ticket);

//Now I want to copy temp to order

}

5 个答案:

答案 0 :(得分:0)

我想你可以使用反射,如果它真的很重要或耗时,但正如我所看到的,有两个主要的选择

  • 一 如果您有权访问该类,只需实现Clonable并使用clone方法生成对象及其所有子对象的深层副本。

  • 两 手动编码。这可能既费时又乏味,但它适用于所有情况。

答案 1 :(得分:0)

我相信你在谈论一个深刻的'复制。

此处详细介绍了类似的问题和各种解决方案:

How do you make a deep copy of an object in Java?

最简单的方法似乎是将对象序列化然后反序列化。

答案 2 :(得分:0)

如果所有字段都是可序列化的,那么您可以使用ObjectOutputStreamObjectInputStream

如果在序列化和反序列化过程中需要特殊处理,请实现特殊方法writeObject()readObject()

请查看IO: Custom Reading and Writing with Serializable


示例代码:

    class MyClass implements Serializable {
        private static final long serialVersionUID = 1L;
        String str;
        List<Integer> list = new ArrayList<Integer>();

        public MyClass(String str) {
            this.str = str;
        }
    }

    MyClass obj1 = new MyClass("abc");
    obj1.list.add(1);

    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(buffer);
    oos.writeObject(obj1);
    oos.close();

    byte[] rawData = buffer.toByteArray();
    ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(rawData));
    MyClass obj2 = (MyClass) ois.readObject();

    System.out.println(obj2.str);
    System.out.println(obj2.list.get(0));

答案 3 :(得分:0)

要使用Serialize / DeSerialize进行深层复制,您可以使用如下代码

public Object deepCopy(Object input) {

    Object output = null;
    try {
        // Writes the object
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(input);

        // Reads the object
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        output = objectInputStream.readObject();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return output;
}

答案 4 :(得分:0)

最好这样做:

Public Response getOrder(Request request) {

Order temp = OrderManager.getOrderbByTicket(request.getTicket());
request.setOrder(temp);


//process the response

}

这将解决将Order返回给函数调用者的问题。如果您希望调用者获取深层副本而不是序列化并反序列化它,然后再将其设置为请求