2012-03-15 118 views
2

我正在使用getConstructors()方法來提取類的構造函數。該類在抽象超類的引用中,我不知道在用戶決定之前哪個子類被調用。這是迄今爲止我所擁有的。如何在構造函數數組中找到復​​制構造函數

Weapon stickCopy = stick; 
System.out.println(stick); 
System.out.println(stickCopy); 

Class <? extends Weapon> myClass = stick.getClass(); 

System.out.println(myClass.getSimpleName()); 

Constructor<?>[] construct = myClass.getConstructors(); 

for(Constructor<?> constructor: construct) 
{ 
    System.out.println(constructor); 
} 

try 
{ 
    stickCopy = (Weapon) construct[2].newInstance((stick)); 
} 
catch (Exception e) 
{ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

System.out.println(stick); 
System.out.println(stickCopy); 

Stick類是抽象Weapon類的子類。我試圖從一個存儲在播放器對象中的Weapon引用中找出深層副本的代碼。由於武器是抽象的,我不能從它調用一個拷貝構造函數。在我的Stick類中,拷貝構造函數是第三個構造函數,所以我在try語句中將2硬編碼到構造數組中。如果我通過在拷貝構造函數前面添加一個新的構造函數或對它們進行重新排序來更改該類的構造函數,如何在運行時找到拷貝構造函數的位置?

此外,我從來沒有使用過泛型,所以,如果我沒有遵循什麼通常被認爲是好的編程實踐,請糾正我。

+4

我不太清楚使用反射這是一個好主意。你可能想考慮在你的'Weapon'類中添加一個'public abstract Weapon deepCopy()'方法,然後每個子類必須實現? – biziclop 2012-03-15 20:04:56

+0

@biziclop 我想我明白爲什麼你的建議可能是一個更好的主意,但我不知道我會如何實現它。我的玩家類中有一個Weapon屬性,它擁有一個任意的子類,比如Stick。我想寫我的getter,以便它做一個副本,而不是傳出參考。會是這樣嗎? 'public Weapon getWeapon(){return weapon.deepCopy(); }' – Gilbrilthor 2012-03-15 20:44:05

+0

是的,這就是我的意思。 – biziclop 2012-03-15 20:55:10

回答

5

如果您使用the version of getConstructor that takes arguments,則可以通過參數類型指定所需的構造函數。想必你會想通過其中Stick.class或Weapon.class在:

Constructor constructor = myClass.getConstructor(myClass); 
+1

參數必須是數組IIRC,否則是最乾淨的解決方案。 – Jochen 2012-03-15 20:08:22

+0

@Jochen現在是可變參數,快樂的日子。 – biziclop 2012-03-15 20:13:24

+0

非常感謝。你給了我一個很好的答案! – Gilbrilthor 2012-03-15 20:16:21

2

Costructor.getParameterTypes()告訴你的類型的構造函數採用的參數。因此請檢查是否有正確類型的對象。