new
演算子とClass.forName(...).newInstance()
の違いは何ですか?どちらもクラスのインスタンスを作成しますが、その違いは何か分かりません。new演算子とClass.newInstance()の違いは何ですか?
答えて
オペレータは、静的に(コンパイル時に)知られているタイプの新しいオブジェクトを作成し、作成しようとしているオブジェクトのコンストラクタを呼び出すことができます。これはオブジェクトを作成するための好ましい方法です。高速で、JVMは積極的な最適化を多数行います。
Class.forName().newInstance()
は、特定の名前のクラスを検索する動的な構造です。 new
を使用するよりも時間がかかります。オブジェクトのタイプをバイトコードにハードコードできないため、オブジェクトを作成する権限があることを確認するためにJVMが権限チェックを行う必要があるからです。また、引数がゼロのコンストラクタを常に使用するため、部分的に安全ではなく、作成しようとしているオブジェクトにnullaryコンストラクタがない場合、例外がスローされます。
つまり、コンパイル時にオブジェクトの種類を作成することがわかっている場合は、new
を使用します。作成するオブジェクトの種類がわからない場合は、Class.forName().newInstance()
を使用してください。
Class.forName
YourClass
のClass
オブジェクトを検索するための検索を行います。
新しい演算子の使用は、YourClass.class.newInstance()
と同じである必要があります。
Class.forNameはデフォルトコンストラクタ(パラメータなし)のみを呼び出し、 クラス名は実行時に提供することができます。構成ファイルから読み取られるdbドライバ名。
これは、引数を必要とするコンストラクタを取得し、リフレクションAPIを使用してオブジェクトをインスタンス化するために使用できるコンストラクタを取得することはできません。しかし、newInstanceメソッドは、引数なしのコンストラクタを特に呼び出すため、可視でアクセス可能である必要があります。 templatypypedefの答えは最も完全であり、正確で有益です。 – LINEMAN78
両方とも効果的に同じことをしますが、Class.forName( 'class')。getInstance()の代わりにnew演算子を使用する必要があります。後者は、リフレクションAPIを使用して、実行時にクラスをルックアップします。新しい演算子を使用することによって、VMは事前にそのクラスを使用することを知り、より効率的になります。
Class.forName('myClass').newInstance()
がロードされていない場合は、クラスをロードします。ここでは初期コンストラクタを呼び出し、コンストラクタの静的部分のみを実行します。
new
演算子は、新しいオブジェクトの初期化に使用されます。
new
演算子とClass.forName()
の両方からインスタンスを作成することができます。newInstance()
の静的ブロックを作成して2回目の初期化は行われません。
Class.forName('myClass).newInstance()
の良い例は、あなたがオブジェクトを作成するために、ハードコードにクラス名を持っていないので、動的にクラスをインスタンス化する必要がある場合は、JDBCドライバ
Class.forName("com.mysql.JDBC.Driver").newInstance()
Class.forName("your class name").newInstance()
が便利です。
リモートソースからクラスを動的にロードするシナリオを想像してみてください。名前はわかりますが、コンパイル時には名前をインポートできません。この場合、new
を使用して新しいインスタンスを作成することはできません。なぜJavaがnewInstance()
メソッドを提供するのか(理由の1つ)です。
素晴らしい!それは役に立つ応答です! –
オブジェクトのゼロ引数コンストラクタがない場合は、オブジェクトも作成され、例外もスローされません。以下のコードスニペットをご覧ください。
try {
Class o = Class.forName("com.myCompany.MyClass");
Constructor m = o.getConstructor(Integer.class,String.class);
m.newInstance(new Integer(0),new String(""));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
主な相違点は、Class.forName('your class name').newInstance()
は動的であり、タイプはコードにハードコードする必要はないということです。
Class.forName("your class name").newInstance()
あなたは、インスタンスがnew
に似たクラスの仕事を形成取得したいときに使用していますが、jarファイルまたはリモートサーバにクラスからインスタンスを取得したいときに便利ですし、あなたがそれをインポートすることはできませんコンパイル時に
例:Class.forName("YOUR JDBC DRIVER").newInstance()
の場合、コンパイル時にJDBCクラスをインポートすることはできません。
JDBCの例はあまり良くありません。以前のバージョンのMySQL JDBCドライバでは 'newInstance()'を呼び出す必要がありました。 –
はのはcom.statckoverflow.Test
Class.forName
を想定してみましょう - それは、テストクラスをロードし、名前、パッケージ、コンストラクタ、注釈、メソッド、フィールドのようにテストクラスのメタデータを含むClass
クラスオブジェクトを返します。
newInstance()
- Java Reflectionを使用して新しいオブジェクトをインスタンス化するために使用されます。内部的にゼロのパラメータコンストラクタがTest
クラスで呼び出されます。つまり、Class
クラスオブジェクトは、ゼロパラメータコンストラクタを呼び出すことによってTest
クラスオブジェクトを作成します。Test
クラスの詳細については、リフレクションを使用できます。コンストラクタ、メソッドなど
new
operator - クラスの新しいオブジェクトを作成し、Class
をインスタンス化し、そのコンストラクタを呼び出すことができます。
- 1. VBScriptの+演算子と&演算子の違いは何ですか?
- 2. jQuery.Deferred() - "new"演算子はオプションですか?
- 3. 特定のクラスのnew演算子とdelete演算子をオーバーライドする理由は何ですか?
- 4. |の違いは何ですか? ||または演算子?
- 5. size_tパラメータnew演算子
- 6. PHPの等価比較演算子と同一比較演算子の違いは何ですか?
- 7. フリップフロップ演算子とは何ですか?
- 8. ##演算子とは何ですか?
- 9. new演算子と参照エラー
- 10. Actionscript 3では、 "in"演算子と "hasOwnProperty"メソッドの違いは何ですか?
- 11. Perlの(、、)と(||、&&)の短絡演算子の違いは何ですか?
- 12. Javaのequals()とC++の演算子==の違いは何ですか?
- 13. LINQ-to-SQLのwhere句と&&演算子の違いは何ですか?
- 14. 演算子new []とplacement newを通常のdelete []
- 15. 論理ORと短絡OR演算子の違いは何ですか?
- 16. 演算子のアリティは何ですか?
- 17. この演算子は何ですか:&=
- 18. JavaScriptの%演算子は何ですか?
- 19. ^=演算子、それは何ですか?
- 20. C++ 'new'演算子 - 使用モード?
- 21. C#の `new object()`と `new {}`の違いは何ですか?
- 22. ||演算子は=演算子と同じですか?
- 23. ルビブール演算子または||違い
- 24. クラスnewとdelete演算子でメモリリークを処理するC++
- 25. MySQLのIN演算子と=演算子の間にパフォーマンスの違いはありますか?
- 26. 疑問符とは何ですか?とコロン ":"演算子は?
- 27. ImageViewとjava(Android)のnew演算子を使用する対比
- 28. Xval演算子と比較演算子?
- 29. スカラーパーセント演算子(%)とストリングのメソッドは何ですか?
- 30. Luaパターンの交代演算子とは何ですか?
その人気のインタビューの質問&これは素晴らしい答えです...ありがとう –
あなたは引数を必要とするコンストラクタを得ることができ、それらを使用してリフレクションAPIを通じてオブジェクトをインスタンス化することができます。 –
'ClassNotFoundException'がチェックされているので、これをコンパイルすることはできません。' try {optlib.SomeClass obj = new optlib.SomeClass(); } catch(ClassNotFoundException e){} '。この場合、Class.forName()。newInstance()を使用する必要があります。 –