【问题标题】:How to clone "class tree" with other classes name in JAVA?如何在 JAVA 中用其他类名克隆“类树”?
【发布时间】:2018-05-06 06:55:05
【问题描述】:

假设我有 2 个继承了很多字段的类,

我想创建另一个具有相同值的类 C、D 的“继承系列” - 内容(在 RUN TIME 中),如下例所示..

package server.api.analytics;

public class A {

    protected String param1;
    protected String param2;
    protected String param3;

    public String getParam1() {
        return param1;
    }

    public void setParam1(String param1) {
        this.param1 = param1;
    }

    public String getParam2() {
        return param2;
    }

    public void setParam2(String param2) {
        this.param2 = param2;
    }

    public String getParam3() {
        return param3;
    }

    public void setParam3(String param3) {
        this.param3 = param3;
    }

    public static void main(String[] args) {
        B b = new B();
        b.setParam1("out_param1");
        b.setParam2("out_param2");
        b.setParam3("out_param3");
        b.setParam4("out_param4");
        b.setParam5("out_param5");
        System.out.println(b.toString());

    // OUTPUT:
     B{param1='out_param1', param2='out_param2', param3='out_param3', 
         param4='out_param4', param5='out_param5'}
  //  EXPECTED : 
     D{param1='out_param1', param2='out_param2', param3='out_param3', 
         param4='out_param4', param5='out_param5'}
    }
}

class B extends A {
    protected String param4;
    protected String param5;

    public String getParam4() {
        return param4;
    }

    public void setParam4(String param4) {
        this.param4 = param4;
    }

    public String getParam5() {
        return param5;
    }

    public void setParam5(String param5) {
        this.param5 = param5;
    }

    @Override
    public String toString() {
        return "B{" +
                "param1='" + param1 + '\'' +
                ", param2='" + param2 + '\'' +
                ", param3='" + param3 + '\'' +
                ", param4='" + param4 + '\'' +
                ", param5='" + param5 + '\'' +
                '}';
    }
}

B{param1='out_param1', param2='out_param2', param3='out_param3', param4='out_param4', param5='out_param5'}

我不想像“复制承包商”那样去检查所有属性,因为有很多,如果我用克隆进行“深度复制”,类名将是相同的

预期示例:

D{param1='out_param1', param2='out_param2', param3='out_param3', param4='out_param4', param5='out_param5'}

【问题讨论】:

  • 很难理解这里的真正问题...您能说明您在哪里进行克隆吗?关于您的CLONED_NEW_NAME 输出,这只是您的toString 产生什么内容的问题吗?否则,您是否尝试在克隆对象时生成替代类型/类?
  • 使用复制构造函数。如果你的类有这么多的字段,这看起来很繁重,那么这个类可能还是太大了。
  • 除了类名之外,C 和 D 与 A 和 B 相比有什么不同?
  • @VitalyT,我想我明白了。只有一个类结构 a-->b,然后使用两个不同的导出类/方法将 a-->b 存储到不同的实体中不是更容易吗?
  • 创建一个Exporter 类,您可以通过在构造函数中设置要导出到的实体名称来配置它,然后有一个导出方法export(B b) 将给定对象存储在为此的实体集中Exporter 的特定实例。这个例子当然被大大简化了,因为我对 API 和需要配置的内容一无所知。

标签: java java-8 clone


【解决方案1】:

您可以使用BeanUtils.copyProperties((Object dest, Object orig)apache common library

将属性值从源 bean 复制到目标 bean 属性名称相同的所有情况。

例如:

  • B 扩展 A
  • D entends C

下面的代码可以将B的所有文件复制到D

import org.apache.commons.beanutils.BeanUtils;

public class Main {

    public static void main(String[] args) throws Exception {
        B source = new B();
        source.setParam("param");
        source.setParameter("parameter");
        D target = new D();
        try {
            BeanUtils.copyProperties(target, source);
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println(source.getParam());  // param
        System.out.println(source.getParameter());  // parameter
        System.out.println(target.getParam()); // param
        System.out.println(target.getParameter()); // parameter
    }

    public static class A {
        String param;

        public String getParam() {
            return param;
        }

        public void setParam(String param) {
            this.param = param;
        }
    }

    public static class B extends A {
        String parameter;

        public String getParameter() {
            return parameter;
        }

        public void setParameter(String parameter) {
            this.parameter = parameter;
        }
    }

    public static class C {
        String param;

        public String getParam() {
            return param;
        }

        public void setParam(String param) {
            this.param = param;
        }

    }

    public static class D extends C {
        String parameter;

        public String getParameter() {
            return parameter;
        }

        public void setParameter(String parameter) {
            this.parameter = parameter;
        }
    }
}

【讨论】:

  • 您好,它会将类名更改为 other 吗?例如:“D”
  • @VitalyT 不,请参阅我的更新。您需要在复制之前创建一个空的d
  • 会检查一下,你有 Pom.xml 的 maven 属性吗?
  • @VitalyT commons-beanutilscommons-beanutils1.8.3
  • BWT,如果我需要继承,我需要创建,例如 "class D extends F" ??
猜你喜欢
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多