将类的一个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
}
答案 0 :(得分:0)
我想你可以使用反射,如果它真的很重要或耗时,但正如我所看到的,有两个主要的选择
一
如果您有权访问该类,只需实现Clonable
并使用clone
方法生成对象及其所有子对象的深层副本。
两 手动编码。这可能既费时又乏味,但它适用于所有情况。
答案 1 :(得分:0)
我相信你在谈论一个深刻的'复制。
此处详细介绍了类似的问题和各种解决方案:
How do you make a deep copy of an object in Java?
最简单的方法似乎是将对象序列化然后反序列化。
答案 2 :(得分:0)
如果所有字段都是可序列化的,那么您可以使用ObjectOutputStream
和ObjectInputStream
。
如果在序列化和反序列化过程中需要特殊处理,请实现特殊方法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返回给函数调用者的问题。如果您希望调用者获取深层副本而不是序列化并反序列化它,然后再将其设置为请求