将所有字段从一个对象移动到另一个对象

Moving all fields from one object into another

我能否以某种方式将所有字段值从一个对象移动到另一个对象 而不 使用反射?所以,我想做的是这样的:

public class BetterThing extends Thing implements IBetterObject {
    public BetterThing(Thing t) {
        super();
        t.evolve(this);
    }
}

因此,evolve 方法会将一个 class 演变成另一个。参数将是 <? extends <? extends T>>,其中 T 是对象的 class,您正在调用 evolve on.

我知道我可以通过反射来做到这一点,但是反射会影响性能。在这种情况下 Thing class 位于外部 API,并且没有方法可以将所有必需的字段从它复制到另一个对象。

您应该尝试使用通过缓存结果来加速反射操作的库来尽量减少对性能的影响。看看 Apache common-beanutils or Dozzer

正如@OliverCharlesworth 指出的那样,它不能直接完成。您将不得不诉诸反思(尽管我不推荐这样做!)或一系列逐个字段的作业。

另一个选择是从继承切换到组合:

public class BetterThing implements IBetterObject {
    Thing delegate;

    public BetterThing(Thing t) {
        this.delegate = t;
    }

    // Thing methods (delegate methods)
    String thingMethodOne() {
        return delegate.thingMethodOne();
    }

    // BetterThing methods
}

这通常被称为decorator pattern

参见:Prefer composition over inheritance?

您可以以更便宜的方式使用反射。我做了一个应用程序,当我第一次 运行 程序时,我将属性名称和 getter 和 setter 方法保存在映射中,当我需要提取属性时,我只需调用传递对象的相同方法即可调用它。这比在需要clone的时候每次都用反射获取方法对象有很好的性能。

另一种方法可能是使用像 Jackson 之类的序列化程序,但这将是一项序列化和反序列化的昂贵任务。