new
演算子とClass.forName(...).newInstance()
の違いは何ですか?どちらもクラスのインスタンスを作成しますが、両者の違いはわかりません。
new
演算子は、静的に(コンパイル時に)既知である型の新しいオブジェクトを作成し、作成しようとしているオブジェクトの任意のコンストラクターを呼び出すことができます。これは、オブジェクトを作成するための推奨される方法です。高速であり、JVMは多くの積極的な最適化を行います。
Class.forName().newInstance()
は、特定の名前のクラスを検索する動的構成体です。 new
を使用するよりも遅くなります。これは、オブジェクトのタイプをバイトコードにハードコードできず、オブジェクトを作成する権限があることを確認するために、JVMが権限チェックを行う必要があるためです。また、常に引数なしのコンストラクターを使用するため、部分的に安全ではありません。作成しようとしているオブジェクトにnullコンストラクターがない場合は、例外がスローされます。
つまり、作成するオブジェクトのタイプがコンパイル時にわかっている場合は、new
を使用します。作成するオブジェクトのタイプがわからない場合は、Class.forName().newInstance()
を使用します。
Class.forName("your class name").newInstance()
は、オブジェクトを作成するためにクラス名をハードコーディングする必要がないため、クラスを動的にインスタンス化する必要がある場合に役立ちます。
リモートソースから動的にクラスをロードするシナリオを想像してみてください。あなたはそれらの名前を知っていますが、コンパイル時にそれらをインポートすることはできません。この場合、new
を使用して新しいインスタンスを作成することはできません。これが(1つの理由)JavaがnewInstance()
メソッドを提供する理由です。
Class.forNameはデフォルトのコンストラクター(パラメーターなし)のみを呼び出すことができ、実行時にクラス名を指定できます。構成ファイルから読み取られたdb-driver名。
大きな違いはClass.forName('your class name').newInstance()
は動的であるため、型をコードにハードコーディングする必要がないためです。
Class.forName("your class name").newInstance()
は、new
と同様にクラスからインスタンスを取得する場合に使用されますが、jarファイルまたはリモートサーバーのクラスからインスタンスを取得する場合に役立ちます。あなたできませんコンパイル時にインポートします。
例:Class.forName("YOUR JDBC DRIVER").newInstance()
、コンパイル時にJDBCクラスをインポートできません。
Class.forName('myClass').newInstance()
は、まだロードされていない場合にクラスをロードします。ここでは、初期コンストラクターを呼び出し、コンストラクターの静的な部分のみを実行します。
new
演算子は、新しいオブジェクトを初期化するために使用されます。
new
演算子とClass.forName()
の両方から多くのインスタンスを作成できます。newInstance()
静的ブロックを作成する2回目の違いは、初期化されません。
Class.forName('myClass).newInstance()
の良い例はJDBCドライバーです
Class.forName("com.mysql.JDBC.Driver").newInstance()
_Class.forName
_は、Class
のYourClass
オブジェクトを検索するルックアップを実行します。
New演算子の使用は、YourClass.class.newInstance()
と同じである必要があります。
どちらも実質的に同じことを行いますが、Class.forName( 'class')。getInstance()を実行する代わりに、new演算子を使用する必要があります。後者は、実行時にクラスを検索するためにリフレクションAPIを使用します。 VMは、new演算子を使用することで、そのクラスを使用する必要があることを事前に認識しているため、より効率的です。
_com.statckoverflow.Test
_と仮定しましょう
_Class.forName
_-Testクラスをロードし、名前、パッケージ、コンストラクター、アノテーション、メソッド、フィールドなどのTestクラスのメタデータを含むClass
クラスオブジェクトを返します。
newInstance()
-Javaリフレクションを使用して新しいオブジェクトをインスタンス化するために使用されます。内部的にゼロのパラメーターコンストラクターがTest
クラスで呼び出されます。つまり、Class
クラスオブジェクトは、ゼロパラメーターコンストラクターを呼び出すことによってTest
クラスオブジェクトを作成します。Test
クラスの詳細にリフレクションを使用できます。
new
演算子-Class
をインスタンス化するクラスの新しいオブジェクトを作成し、それらのコンストラクターを呼び出すことができます。