通过反射将基类转换为派生类

时间:2015-02-04 14:51:57

标签: java reflection downcast

嗨,我必须从一个对象构造一个对象。由于基类有超过50个字段,我不想做像

这样的事情
//obj1 is an instance of BaseClass
DerivedClass obj2 = new DerivedClass();
obj2.setField1(obj1.getField1());
obj2.setField2(obj1.getField2())
.... so on

正如你从标题中看到的,我想向下转换我的对象,但java不允许这样做。是否有实用程序库或smth提供类似

的方法
Object convert(BaseClass obj1, DerivedClass obj2)

2 个答案:

答案 0 :(得分:2)

您可以使用Apache Commons BeanUtils执行此操作。使用其BeanUtils类,您可以访问许多实用程序方法,以通过反射填充JavaBeans属性。

要将所有公共/继承属性从基类对象复制到派生类对象,可以使用其静态copyProperties()方法

BeanUtils.copyProperties(baseClassObj, derivedClassObj);

来自BeanUtils.copyProperties()文档

  

对于属性名称相同的所有情况,将属性值从原始bean复制到目标bean。

如果您不想使用第三方库,那么您的下一个最佳选择是在派生类上提供一个实用程序方法,该方法使用其父类的实例的所有属性初始化自身。

public void initFromParent(BaseClass obj) {
    this.propOne = obj.getPropOne();
    // ... and so on
}

答案 1 :(得分:0)

如果演员表有效,您可以向下转播:

BaseClass instance = new DerivedClass();
if(DerivedClass.class.isAssignableFrom(instance.getClass()) {
    DerivedClass dc = DerivedClass.class.cast(instance);
}

但通常会实现一个具有相同参数的构造函数并调用super()

甚至更好,使用组合,其中DerivedClass不是继承而是拥有BaseClass的实例,并将字段的调用委托给该对象。