将一个Java对象复制到另一个对象
将一个类的一个Java对象复制到同一个类的另一个对象的最佳方法是什么?我尝试了BeanUtil.copyProperties,但由于某种原因它不起作用。这个类是一个复杂的类。(类包含另一个类对象等) 我的目标是通过hibernate函数按顺序填充值将一个Java对象复制到另一个对象,java,object,copy,javabeans,pojo,Java,Object,Copy,Javabeans,Pojo,将一个类的一个Java对象复制到同一个类的另一个对象的最佳方法是什么?我尝试了BeanUtil.copyProperties,但由于某种原因它不起作用。这个类是一个复杂的类。(类包含另一个类对象等) 我的目标是通过hibernate函数按顺序填充值 Public Response getOrder(Order order, Ticket ticket) { order = OrderManager.getOrderByTicket(ticket); //Hibernate function T
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
}
我想你可以使用反射,如果它真的很重要或者很耗时的话,但是在我看来,有两个主要的选择
- 一个
如果您有权访问该类,只需实现
,并让Clonable
方法生成对象及其所有子对象的深度副本clone
- 两个 手工编码。这可能很费时,也很无聊,但在任何情况下都是有效的
- 我相信你说的是“深度”拷贝
此处详细介绍了类似的问题和各种解决方案:
最简单的方法似乎是序列化对象,然后反序列化它。如果所有字段都可序列化,那么您可以使用
ObjectOutputStream
和ObjectInputStream
如果在序列化和反序列化过程中需要特殊处理,请实现特殊方法writeObject()
和readObject()
请看一看
示例代码:
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));
类MyClass实现可序列化{
私有静态最终长serialVersionUID=1L;
字符串str;
列表=新的ArrayList();
公共MyClass(字符串str){
this.str=str;
}
}
MyClass obj1=新的MyClass(“abc”);
obj1.列表.添加(1);
ByteArrayOutputStream缓冲区=新建ByteArrayOutputStream();
ObjectOutputStream oos=新的ObjectOutputStream(缓冲区);
oos.writeObject(obj1);
oos.close();
字节[]rawData=buffer.toByteArray();
ObjectInputStream ois=新的ObjectInputStream(新的ByteArrayInputStream(rawData));
MyClass obj2=(MyClass)ois.readObject();
System.out.println(obj2.str);
System.out.println(obj2.list.get(0));
要使用序列化/反序列化进行深度复制,可以使用如下代码:
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;
}
最好这样做:
Public Response getOrder(Request request) {
Order temp = OrderManager.getOrderbByTicket(request.getTicket());
request.setOrder(temp);
//process the response
}
这将解决将订单返回给函数调用方的问题。如果您希望调用方获得一个深度副本,而不是在将其设置为请求之前对其进行序列化和反序列化,那么您应该提供更多信息和/或一些示例代码,或者在出现异常时提供stacktrace,以便我们能更好地帮助您解决问题。问题是我正在通过5个函数传递一个对象,并希望分配这些值使用hibernate。当我执行obj=getObj()时,它将丢失其pass-by引用,并且更改不会反映回主函数。我正在尝试执行temp=getObj()并尝试将值从temp复制到obj。我不认为你的例子会起作用,因为如果我使用obj=deepCopy(temp),我会回到原点,不要担心通过引用传递值等等。这是一个在Hibernate环境中使用的代码,它只是为给定对象和所有子对象(从DB读取,并可用于作为新记录集再次插入)进行复制。问题是我正在通过5个函数传递对象,并希望使用Hibernate分配值。当我执行obj=getObj()时,它将丢失其pass-by引用,并且更改不会反映回主函数。我正在尝试执行temp=getObj()并尝试将值从temp复制到obj。我认为你的例子行不通,因为如果我使用obj=deepCopy(temp),我会回到原点。老实说,我不是100%理解你的问题。您想要保留引用,但也想要整个图形的副本(您编写的对象很复杂,所以我假设了更多级别)。你能举一些例子让它更清楚吗?通过Hibernate分配值您的意思是,Hibernate将填充这些值,对吗?在此之后,您是否希望继续连接到会话?getOrder有2个参数,但您只传递了一个?啊,好的,现在我开始理解,您希望返回响应并修改参数引用。我认为这是不可能的。您应该将其打包到诸如Response.setTicket(ticketticket)之类的容器对象中,或者如果不可能,则使用Ticket和order属性创建一个请求类,然后:Request.setOrder(OrderManager.getOrder(Request.getTicket())