通过反射将基础 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 的实例,并将对字段的调用委托给该对象。
嗨,我必须从 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 的实例,并将对字段的调用委托给该对象。