6

そのため、実行時にクラス コンストラクターを呼び出そうとしています。次のコード スニペットがあります。

String[] argArray = {...};
...
Class<?> tempClass = Class.forName(...);
Constructor c = tempClass.getConstructor(String[].class); 
c.newInstance(argArray);
...

コードをコンパイルしてクラスに渡すたびに、IllegalArgumentException: 引数の数が間違っています。私が呼び出しているクラスのコンストラクターは、String[] を唯一の引数として受け取ります。また奇妙なのは、コンストラクターを変更して整数を取り、Integer.TYPE を使用して c.newInstance(4) などを呼び出すと、それが機能することです。誰かが私が間違っていることを説明できますか? ありがとうございました。

編集;; 完全なエラー:

java.lang.IllegalArgumentException: wrong number of arguments
[Ljava.lang.String;@2be3d80c
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
4

2 に答える 2

11

これはnewInstance(Object...)、のvarargsObjectつまり。を取得するために発生しますObject[]。配列は共変であるため、aString[]もでありObject[]最初の引数ではなくすべての引数argArrayとして解釈されます。

jdbのソリューションは、コンパイラーの誤解を防ぐために機能します。次のように書くこともできます。

c.newInstance(new Object[] {argArray});
于 2013-01-24T00:25:25.583 に答える
10

それが最善の修正であるかどうかはわかりませんが、これはうまくいくはずです:

c.newInstance((Object)argArray);
于 2013-01-24T00:19:07.757 に答える