0

持っている:

Class<? extends MyInterface> clazz = ...;

私は(そしてなぜ)書くべきですか:

Constructor<? extends MyInterface> ctor = clazz.getConstructor();
MyInterface object = ctor.newInstance();

また:

MyInterface object = clazz.newInstance();

選択は、使用するコンストラクターが空であるか、引数を取るかによって異なりますか?

4

5 に答える 5

1

のJavadocによるとnewInstance()

クラスは、空の引数リストを持つ新しい式のようにインスタンス化されます。クラスがまだ初期化されていない場合、クラスは初期化されます。

どうやら、あなたはのためnewInstance()のショートカットとして使用することができます

Constructor<? extends MyInterface> ctor = clazz.getConstructor();
MyInterface object = ctor.newInstance();

ただし、微妙な違いがあります。Class#newInstance()コンストラクターからのExcptionを。内にラップしますExceptionInInitializerErrorが、Constructor#newInstance()はそれを。内にラップしInvocationTargetExceptionます。

于 2013-03-27T13:56:05.717 に答える
1

この同様の質問を見てください。このリンクには、さらにいくつかの例とより詳細な説明もあります。

To sum up the arguments (from the second link):

    Class.newInstance() can only invoke the zero-argument constructor, 
    while Constructor.newInstance() may invoke any constructor, regardless 
    of the number of parameters.

    Class.newInstance() throws any exception thrown by the constructor, 
    regardless of whether it is checked or unchecked. 

    Class.newInstance() requires that the constructor be visible;  
    Constructor.newInstance() may invoke private constructors under certain 
    circumstances.

投稿を編集して引用符を追加して申し訳ありませんが、これは私ができるよりもうまく説明しています。Class.newInstance()のJavadocは、次のように説明しています。

このClassオブジェクトによって表されるクラスの新しいインスタンスを作成します。クラスは、空の引数リストを持つ新しい式のようにインスタンス化されます。クラスがまだ初期化されていない場合、クラスは初期化されます。

このメソッドは、チェックされた例外を含め、nullaryコンストラクターによってスローされたすべての例外を伝播することに注意してください。このメソッドを使用すると、コンパイラによって実行されるコンパイル時の例外チェックを効果的にバイパスできます。Constructor.newInstanceメソッドは、コンストラクターによってスローされた例外を(チェックされた)InvocationTargetExceptionでラップすることにより、この問題を回避します。

于 2013-03-27T13:57:14.160 に答える
0

ソースコードによるとof java.lang.Class Class.newInstance()と同じですConstructor.newInstance()

実装では、デフォルトのコンストラクター(パラメーターのないコンストラクター)が呼び出されます

于 2013-03-27T13:55:07.730 に答える
0

clazz.newInstance()Constructor実際にオブジェクトを取得しようとするため、最終的には同じになります。

最初の構文では、引数を持つコンストラクターを使用してクラスをインスタンス化できます。

于 2013-03-27T13:56:08.420 に答える
0

答えは、のjavadocを完全に読んだことから明らかですjava.lang.Class

  • このclazz.newInstance()アプローチは、引数なしのコンストラクターでのみ機能します。

  • 、etcアプローチはclazz.getConstructor()、引数を持つコンストラクターでも機能します...コンストラクター引数の型と値を指定する場合に限ります。

ユースケースで引数なしのコンストラクターを使用するだけでよい場合clazz.newInstance()は、より簡単なアプローチです。

于 2013-03-27T13:58:16.207 に答える