我可以以某种方式将所有字段值从一个对象移动到另一个而不使用使用反射吗?所以,我想做的是这样的事情:
public class BetterThing extends Thing implements IBetterObject {
public BetterThing(Thing t) {
super();
t.evolve(this);
}
}
因此,evolve
方法会将一个类演变为另一个类。参数为<? extends <? extends T>>
,其中T
是对象的类,您正在调用evolve
。
我知道我可以用反射做到这一点,但反射会伤害性能。在这种情况下,Thing
类在外部API中,并且没有方法可以将所有必需字段从它复制到另一个对象。
答案 0 :(得分:5)
正如@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。
答案 1 :(得分:0)
您应该尝试通过使用通过缓存结果来加速反射操作的库来最小化性能影响。看看Apache common-beanutils或Dozzer。
答案 2 :(得分:0)
您可以以更便宜的方式使用Reflection。我创建了一个应用程序,当我第一次运行程序时,我在地图中保存属性名称和getter和setter方法,当我需要提取属性时,我只是调用那些传递对象的相同方法来调用它。这比使用反射每次在需要克隆时获取方法对象具有良好的性能。
另一种方法可能是使用像Jackson这样的序列化程序,但序列化和反序列化将是一项昂贵的任务。