2016-04-05 5 views
2

クラスクラスからオブジェクトを作成しようとしました(Javaリフレクションを介して) - ユーザーがコンストラクタを選択しましたが、このコンストラクタの変数を読み込む必要があります。プリミティブ型)。
ここからわかるように、私のコードは整数型パラメータに対してのみ動作します。コンストラクタオブジェクトから引数型を取得する(Java Reflection)

現在の引数のタイプを動的に把握してキーボードから読み取るにはどうすればよいですか?

public static Object chooseConstr(Class cls) throws IllegalAccessException, InstantiationException, InvocationTargetException { 
    Scanner keyboard = new Scanner(System.in); 

    Constructor[] constructors = cls.getDeclaredConstructors(); 
    System.out.println("Choose constructor from the list: "); 
    System.out.println(Arrays.toString(constructors)); 

    int constr = keyboard.nextInt(); 
    constr--; 


    Object[] arguments=new Object[constructors[constr].getParameterCount()]; 

    for(int i=0; i<arguments.length; i++){ 
     System.out.println("Write argument #"+(i+1)); 
     arguments[i]=keyboard.nextInt(); 
    } 


    Object object = constructors[constr].newInstance(arguments); 

    System.out.println("Object created!"); 
    return object; 
} 

答えて

0

これは難しいでしょう。もちろん、スキャナーにはいくつかの種類の基本的な読み方がありますが、他の種類の引数を読みたい場合は、自分で読み込む方法を見つけなければなりません。このため

、あなたがConstructor.getParameterTypes()を使用することができます。上記の完全なものではありません

... 
Object[] arguments = new Object[constructors[constr].getParameterCount()]; 

Class<?>[] pTypes = constructors[constr].getParameterTypes(); 

for (int i = 0; i < arguments.length; i++) { 
    System.out.println("Write argument #" + (i + 1) + ". Of type: "+pTypes[i].getName()); 

    if(pTypes[i].equals(int.class)) {    
     arguments[i] = keyboard.nextInt(); // read an int 
    } else if(pTypes[i].equals(String.class)) { 
     arguments[i] = keyboard.next(); // read a String 
    } else { 
     // custom read code for other types 
    } 
} 
... 

。なお、スキャナは、私がここに表示されませんでした、あまりにも他のタイプを読むために複数の方法を持っています。

他のタイプの引数を読み取るための最良の方法は、文字列として読み込み、ファクトリメソッドを使用して対応するオブジェクトに変換することです。

+0

私はあなたがプリミティブのためだけに必要であることに気づいたので、これは私が言ったより簡単です。ちょうどそれが他のタイプのためにも働くことに注意してください。 –

関連する問題