通过反射将基础 class 转换为派生 class

casting base class to derived class via reflection

嗨,我必须从 object 构造一个 object。由于基础 class 有超过 50 个字段,我不想做

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

正如您从标题中看到的那样,我想降低我的 object 但 java 不允许这样做。是否有实用程序库或 smth 提供类似

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

您可以使用 Apache Commons BeanUtils 来执行此操作。使用它的 BeanUtils class 您可以访问许多实用方法来通过反射填充 JavaBeans 属性。

要将所有 common/inherited 属性从基础 class object 复制到派生 class object,您可以使用它的静态 copyProperties()方法为

BeanUtils.copyProperties(baseClassObj, derivedClassObj);

来自 BeanUtils.copyProperties() 文档

Copy property values from the origin bean to the destination bean for all cases where the property names are the same.

如果您不想使用 third-party 库,您的下一个最佳选择是在派生的 class 上提供一个实用方法,该方法使用实例的所有属性初始化自身它的 parent class.

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

如果转换有效,你可以向下转换:

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

但通常人们会使用相同的参数实现构造函数并调用 super().

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