簡體   English   中英

通過反射將基類轉換為派生類

[英]casting base class to derived class via reflection

嗨,我必須從一個對象構造一個對象。 由於基類有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)

您可以使用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
}

如果強制轉換有效,則可以向下轉換:

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

但是通常情況下,將使用相同的參數實現構造函數並調用super()

甚至更好的方法是使用組合,在這種方法中,DerivedClass代替了繼承而持有BaseClass的一個實例,並將對該字段的調用委托給該對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM