あなたができることは、Java Reflect API を使用することです。これは最も簡単な実装を提供しますが、他のソリューションほど高速ではない可能性があります。
基本的に行う必要があるのは、すべてのデータを Model から ExtendedModel に渡し、ExtendedModel にもちろん Model を拡張させることです。
私の「モデル」クラス:
public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
Model model = new Model(1);
ExtendedModel extended = model.get(ExtendedModel.class);
extended.setA2("Hello World");
System.out.println(extended.getA1());
System.out.println(extended.getA2());
}
private int a1;
public Model() {}
public Model(int a1) {
this.a1 = a1;
}
public void setA1(int a1) {
this.a1 = a1;
}
public int getA1() {
return this.a1;
}
/**
* This method will transform the current object into an ExtendedModel.
* @throws SecurityException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public <T> T get(Class<? extends T> classType) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
T object = classType.getConstructor().newInstance();
// pass all the data via setters
for (Field field : this.getClass().getDeclaredFields()) {
String methodName = "set"+StringUtil.ucfirst(field.getName()); // uppercase first!
classType.getMethod(methodName, field.getType()).invoke(object, field.get(this));
}
// return object
return object;
}
私の「ExtendedModel」クラス:
public class ExtendedModel extends Model {
private String a2;
public ExtendedModel() {}
public String getA2() {
return this.a2;
}
public void setA2(String a2) {
this.a2 = a2;
}
}
もちろん、プロパティに直接アクセスする代わりにゲッターを使用することもできます。これは、他のクラス/オブジェクトでも簡単にソリューションを使用するのに役立ちます。唯一の重要なことは次のとおりです。
- デフォルトのコンストラクターを宣言します (パラメーターなし、またはパラメーターのセットと既知の数)。
- 「Model」から「ExtendedModel」または拡張したい任意のクラスにすべてのデータをコピーします。