2012-03-15 1 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); 

スティッククラスは抽象的なウェポンクラスのサブクラスです。私は、プレイヤーオブジェクトに格納されているWeaponリファレンスから深いコピーのコードを理解しようとしています。武器は抽象的なので、私はそれからコピーコンストラクタを呼び出すことはできません。私のStickクラスでは、コピーコンストラクタは3番目のコンストラクタなので、tryステートメントのコンストラクタ配列に2をハードコーディングしました。たとえば、コピーコンストラクタの前に新しいコンストラクタを追加したり、並べ替えるなどしてスティッククラスのコンストラクタを変更した場合、実行時にコピーコンストラクタの位置を見つけるにはどうすればよいですか?

また、以前はジェネリックスを使用したことがありませんでした。したがって、一般的に良いプログラミングプラクティスと見なされていない場合は、修正してください。

+4

これは良いアイデアですが、私はリフレクションを使用してよく分かりません。 'Weapon'クラスに' public abstract Weapon deepCopy() 'メソッドを追加することをお勧めします。それぞれのサブクラスは実装する必要がありますか? – biziclop

+0

@biziclop 私はあなたの提案がより良いアイデアかもしれないと思うが、私はそれをどのように実装するのか分からない。私はプレイヤークラスに杖のような任意のサブクラスを保持する武器属性を持っています。私は参照を渡す代わりにコピーを行うように私のゲッターを記述したいと思います。それはこのようなものでしょうか? 'public Weapon getWeapon(){return weapon.deepCopy(); } ' – Gilbrilthor

+0

はい、そうです。 – biziclop

答えて

5

the version of getConstructor that takes argumentsを使用する場合は、その引数タイプでコンストラクタを指定できます。おそらくあなたは、中Stick.classまたはWeapon.classのいずれかに合格したいと思う:(

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

このパラメータはIIRCの配列でなければなりませんが、それ以外は最もクリーンなソリューションです。 – Jochen

+0

@Jochenそれは今、varargs、幸せな日です。 – biziclop

+0

ありがとうございました。あなたは私にそのような良い答えを与えました! – Gilbrilthor

2

Costructor.getParameterTypes)コンストラクタが取るパラメータあなたのタイプを伝えます。正しいタイプのオブジェクトを受け取るものを確認してください。

関連する問題