通过调用getter和setter复制JavaBean

通过调用getter和setter复制JavaBean,java,Java,有没有办法通过调用它的getter和setter来深度复制2个java对象?所有的setter和getter都是公共方法 谢谢 Java提供clone()来执行浅拷贝,但可以扩展以执行深拷贝。更多细节 Java提供clone()来执行浅拷贝,但可以扩展以执行深拷贝。更多细节 在Commons中,BeanUtils可能通过在两个不同的bean之间匹配getter/setter来实现您想要的功能 public class Test { public static void main(S

有没有办法通过调用它的getter和setter来深度复制2个java对象?所有的setter和getter都是公共方法

谢谢

  • Java提供clone()来执行浅拷贝,但可以扩展以执行深拷贝。更多细节
  • Java提供clone()来执行浅拷贝,但可以扩展以执行深拷贝。更多细节
  • 在Commons中,BeanUtils可能通过在两个不同的bean之间匹配getter/setter来实现您想要的功能

    public class Test
    {
    
        public static void main(String[] args) throws IllegalAccessException, InvocationTargetException
        {
            new Test().run();
        }
    
        private void run() throws IllegalAccessException, InvocationTargetException
        {
            Bean1 one = new Bean1();
            one.setProp1("Foo");
    
            Bean2 two = new Bean2();
    
            BeanUtils.copyProperties(two, one);
    
            System.out.println(ToStringBuilder.reflectionToString(one));
            System.out.println(ToStringBuilder.reflectionToString(two));
        }
    
        public class Bean1
        {
            private String propbean1;
    
            public String getProp1()
            {
                System.out.println("bean1 getter");
                return propbean1;
            }
    
            public void setProp1(String s)
            {
                System.out.println("bean1 setter");
                propbean1 = s;
            }
        }
    
        public class Bean2
        {
            private String propbean2;
    
            public String getProp1()
            {
                System.out.println("bean2 getter");
                return propbean2;
            }
    
            public void setProp1(String s)
            {
                System.out.println("bean2 setter");
                propbean2 = s;
            }
        }
    }
    
    印刷品

    bean1 setter
    bean1 getter
    bean2 setter
    Test$Bean1@1f7d2f0e[propbean1=Foo]
    Test$Bean2@539c5048[propbean2=Foo]
    
    在Commons中,BeanUtils可能通过在两个不同的bean之间匹配getter/setter来实现您想要的功能

    public class Test
    {
    
        public static void main(String[] args) throws IllegalAccessException, InvocationTargetException
        {
            new Test().run();
        }
    
        private void run() throws IllegalAccessException, InvocationTargetException
        {
            Bean1 one = new Bean1();
            one.setProp1("Foo");
    
            Bean2 two = new Bean2();
    
            BeanUtils.copyProperties(two, one);
    
            System.out.println(ToStringBuilder.reflectionToString(one));
            System.out.println(ToStringBuilder.reflectionToString(two));
        }
    
        public class Bean1
        {
            private String propbean1;
    
            public String getProp1()
            {
                System.out.println("bean1 getter");
                return propbean1;
            }
    
            public void setProp1(String s)
            {
                System.out.println("bean1 setter");
                propbean1 = s;
            }
        }
    
        public class Bean2
        {
            private String propbean2;
    
            public String getProp1()
            {
                System.out.println("bean2 getter");
                return propbean2;
            }
    
            public void setProp1(String s)
            {
                System.out.println("bean2 setter");
                propbean2 = s;
            }
        }
    }
    
    印刷品

    bean1 setter
    bean1 getter
    bean2 setter
    Test$Bean1@1f7d2f0e[propbean1=Foo]
    Test$Bean2@539c5048[propbean2=Foo]
    

    我的2个java对象可以是不同的类型,但我只对复制它们的属性感兴趣。+1用于添加序列化作为选项。它还有很多好处,除非你生活在真空中。我的2个java对象可以是不同的类型,但我只对复制它们的属性感兴趣。+1用于添加序列化作为选项。它还有很多好处,除非你生活在真空中。仅仅从阅读java文档来看,yt看起来是基于属性名而不是该属性的setter和getter进行复制的。你知道它实际上是从setter和getter复制的吗?@Sean Nguyen编辑以显示与不同私有属性名称匹配的getter/setter。仅从读取java文档来看,yt看起来是基于属性名称而不是该属性的setter和getter复制的。你知道它实际上是从setter和getter复制的吗?@Sean Nguyen编辑以显示getter/setter与不同私有属性名称的匹配。