2017-10-01 19 views
3

Reflectionを使用してArrayListを宣言しようとしています。以下は私のコードNoSuchMethodException java.lang.Integerのパラメーターがコンストラクター(Reflection)で渡される場合

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException { 
    String intClass="java.lang.Integer"; //This string will be replaced by a string taken from user which will be a class name. 
    Class classOf=Class.forName("java.util.ArrayList"); 
    Class[] parameterslist ={Class.forName(intClass)}; 
    Constructor constructorOfClass=classOf.getConstructor(parameterslist); 
} 

私はこのコードを実行すると、私は

Class[] parameterslist={int.class} 

としてparameterslistを変更すると、それは動作しますが、私のように、パラメータクラスの名前を取らなければならない

Exception in thread "main" java.lang.NoSuchMethodException: java.util.ArrayList.<init>(java.lang.Integer) 

を得るがありますユーザーからの入力ですので、私は直接int.classを書くことはできません。

私は既にClass.forName()Classname.classの違いについて検索しましたが、thisのような回答は同じだと結論づけています。 私はArrayListコンストラクタのパラメータとしてClass.forName()オブジェクトを渡すことができない理由を知りたいだけです。int.classを書き込むと、どのように動作しますか? Class.forName()が正しい方法でない場合、クラス名のオブジェクトをユーザーから入力として取得するにはどうすればよいですか?

+0

まあ、限られた数のプリミティブ型があります。私があなただったら、マップを作成してプリミティブ型の名前をキーとして使用し、対応する 'Class'オブジェクトを値として使用します。 – Sweeper

+0

@スウィーパーあなたは正しいです。これで問題は解決しますが、なぜこの目的でClass.fornameを使用できないのでしょうか? – Ahsan

+0

私は分かりません。 'java.lang.Integer'クラス名をこのコードにハードコードしました。ユーザー入力はどこに入力されますか?または 'Class.forName()'?ここで 'Class.forName()'に間違っているのは、あなたが指定したパラメータだけです。あなたが何を求めているのか不明です。 – EJP

答えて

5

使用したいArrayListコンストラクタは、パラメータとしてプリミティブintなくIntegerクラスを取ります

public ArrayList(int initialCapacity) 

あなたが引数としてIntegerクラスを提供します。

String intClass="java.lang.Integer"; 
... 
Class[] parameterslist ={Class.forName(intClass)}; 

これらは互換性がありません反射の使用のためのタイプ。

Class.fornameが、ユーザーからの入力として受け取ったクラス名のオブジェクト をどうやって作ることができるのか、正しい方法でない場合。

Class.forName()ここでは問題ありません。 コンストラクタの引数として特定のクラスのインスタンスを渡してオブジェクトをリフレクションして作成する場合、クラスはこの型のコンストラクタを提供する必要があります。
ArrayListについて、あなたは引数を持つ唯一の2つのオーバーロードされたコンストラクタがあります。

public ArrayList(Collection<? extends E> c) 

public ArrayList(int initialCapacity) 

をだからCollection型やintタイプの反射によってコンストラクタを取得する可能性があり、それがすべてです。

+0

OPは、いくつかのユーザー入力を取得し、その入力に対応する 'Class'オブジェクトを取得します。したがって、ユーザが 'i​​nt'を入力すると、' int.class'を取得したいとします。 – Sweeper

+0

@Sweeper Maybe。彼の実際の質問、または彼が投稿したコードからは分かりません。私たちが推測するのではなく、明確にするのは彼の責任です。 – EJP

+0

@ Swiperもしそうなら、それは本当に明らかではありません。私は最後の部分に最も答えました: "Class.forName()'オブジェクトを 'ArrayList'コンストラクタへのパラメータとして渡すことができない理由と' int.class'を書くときの仕組みを知りたいだけです。 " – davidxxx

関連する問題