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

问题描述:

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

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

因此,evolve方法将演变一类到另一个。一个参数将是<? extends <? extends T>>其中T是对象的类,您打电话evolve

我知道我可以用反射做到这一点,但反射会伤害到性能。在这种情况下,Thing类在外部API中,并且没有方法可以将所有必需的字段从它复制到另一个对象。

+4

您的选择是(a)反思或(b)明确的成员分配。 –

+1

...或从继承切换到组合。 – aioobe

+0

如果你说Thing在外部API中,我猜它里面没有进化方法。 – AdamSkywalker

正如@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?

+0

这实质上是一个[装饰者](https://en.wikipedia.org/?title=Decorator_pattern)? – jaco0646

+0

@ jaco0646:它对我来说很像。 1+ –

+0

@ jaco0646,是的,谢谢。添加了这个答案。 – aioobe

您应该尝试通过使用通过缓存结果来加速反射操作的库来尽量降低性能影响。看看Apache common-beanutilsDozzer

你可以这样的方式,这将是更便宜的使用反射。我创建了一个应用程序,当我第一次运行程序时,我将属性名称和getter和setter方法保存在地图中,当我需要提取属性时,我只是调用那些传递对象的方法来调用它。与需要克隆时每次使用反射获取方法对象相比,这具有良好的性能。

另一种方式可能是使用像Jackson这样的序列化器,但是这将是一个昂贵的序列化和反序列化任务。