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

将一个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

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

我的目标是通过hibernate函数按顺序填充值

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())