web-dev-qa-db-ja.com

新しい演算子とClass.newInstance()の違いは何ですか?

new演算子とClass.forName(...).newInstance()の違いは何ですか?どちらもクラスのインスタンスを作成しますが、両者の違いはわかりません。

33
i2ijeya

new演算子は、静的に(コンパイル時に)既知である型の新しいオブジェクトを作成し、作成しようとしているオブジェクトの任意のコンストラクターを呼び出すことができます。これは、オブジェクトを作成するための推奨される方法です。高速であり、JVMは多くの積極的な最適化を行います。

Class.forName().newInstance()は、特定の名前のクラスを検索する動的構成体です。 newを使用するよりも遅くなります。これは、オブジェクトのタイプをバイトコードにハードコードできず、オブジェクトを作成する権限があることを確認するために、JVMが権限チェックを行う必要があるためです。また、常に引数なしのコンストラクターを使用するため、部分的に安全ではありません。作成しようとしているオブジェクトにnullコンストラクターがない場合は、例外がスローされます。

つまり、作成するオブジェクトのタイプがコンパイル時にわかっている場合は、newを使用します。作成するオブジェクトのタイプがわからない場合は、Class.forName().newInstance()を使用します。

49
templatetypedef

Class.forName("your class name").newInstance()は、オブジェクトを作成するためにクラス名をハードコーディングする必要がないため、クラスを動的にインスタンス化する必要がある場合に役立ちます。

リモートソースから動的にクラスをロードするシナリオを想像してみてください。あなたはそれらの名前を知っていますが、コンパイル時にそれらをインポートすることはできません。この場合、newを使用して新しいインスタンスを作成することはできません。これが(1つの理由)JavaがnewInstance()メソッドを提供する理由です。

11
Andreas_D

Class.forNameはデフォルトのコンストラクター(パラメーターなし)のみを呼び出すことができ、実行時にクラス名を指定できます。構成ファイルから読み取られたdb-driver名。

5
stacker

大きな違いはClass.forName('your class name').newInstance()は動的であるため、型をコードにハードコーディングする必要がないためです。

3
fastcodejava

Class.forName("your class name").newInstance()は、newと同様にクラスからインスタンスを取得する場合に使用されますが、jarファイルまたはリモートサーバーのクラスからインスタンスを取得する場合に役立ちます。あなたできませんコンパイル時にインポートします。

例:Class.forName("YOUR JDBC DRIVER").newInstance()、コンパイル時にJDBCクラスをインポートできません。

3
Emad Aghayi

Class.forName('myClass').newInstance()は、まだロードされていない場合にクラスをロードします。ここでは、初期コンストラクターを呼び出し、コンストラクターの静的な部分のみを実行します。

new演算子は、新しいオブジェクトを初期化するために使用されます。

new演算子とClass.forName()の両方から多くのインスタンスを作成できます。newInstance()静的ブロックを作成する2回目の違いは、初期化されません。

Class.forName('myClass).newInstance()の良い例はJDBCドライバーです

Class.forName("com.mysql.JDBC.Driver").newInstance()
2
Nipuna

_Class.forName_は、ClassYourClassオブジェクトを検索するルックアップを実行します。

New演算子の使用は、YourClass.class.newInstance()と同じである必要があります。

1
Zeki

どちらも実質的に同じことを行いますが、Class.forName( 'class')。getInstance()を実行する代わりに、new演算子を使用する必要があります。後者は、実行時にクラスを検索するためにリフレクションAPIを使用します。 VMは、new演算子を使用することで、そのクラスを使用する必要があることを事前に認識しているため、より効率的です。

0
salexander

_com.statckoverflow.Test_と仮定しましょう

_Class.forName_-Testクラスをロードし、名前、パッケージ、コンストラクター、アノテーション、メソッド、フィールドなどのTestクラスのメタデータを含むClassクラスオブジェクトを返します。

newInstance()-Javaリフレクションを使用して新しいオブジェクトをインスタンス化するために使用されます。内部的にゼロのパラメーターコンストラクターがTestクラスで呼び出されます。つまり、Classクラスオブジェクトは、ゼロパラメーターコンストラクターを呼び出すことによってTestクラスオブジェクトを作成します。Testクラスの詳細にリフレクションを使用できます。

new演算子-Classをインスタンス化するクラスの新しいオブジェクトを作成し、それらのコンストラクターを呼び出すことができます。

0
Kanchan Kumar