2011-01-06 79 views

答えて

34

オペレータは、静的に(コンパイル時に)知られているタイプの新しいオブジェクトを作成し、作成しようとしているオブジェクトのコンストラクタを呼び出すことができます。これはオブジェクトを作成するための好ましい方法です。高速で、JVMは積極的な最適化を多数行います。

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

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

+1

その人気のインタビューの質問&これは素晴らしい答えです...ありがとう –

+0

あなたは引数を必要とするコンストラクタを得ることができ、それらを使用してリフレクションAPIを通じてオブジェクトをインスタンス化することができます。 –

+0

'ClassNotFoundException'がチェックされているので、これをコンパイルすることはできません。' try {optlib.SomeClass obj = new optlib.SomeClass(); } catch(ClassNotFoundException e){} '。この場合、Class.forName()。newInstance()を使用する必要があります。 –

1

Class.forNameYourClassClassオブジェクトを検索するための検索を行います。

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

4

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

+0

これは、引数を必要とするコンストラクタを取得し、リフレクションAPIを使用してオブジェクトをインスタンス化するために使用できるコンストラクタを取得することはできません。しかし、newInstanceメソッドは、引数なしのコンストラクタを特に呼び出すため、可視でアクセス可能である必要があります。 templatypypedefの答えは最も完全であり、正確で有益です。 – LINEMAN78

0

両方とも効果的に同じことをしますが、Class.forName( 'class')。getInstance()の代わりにnew演算子を使用する必要があります。後者は、リフレクションAPIを使用して、実行時にクラスをルックアップします。新しい演算子を使用することによって、VMは事前にそのクラスを使用することを知り、より効率的になります。

2

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

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

new演算子とClass.forName()の両方からインスタンスを作成することができます。newInstance()の静的ブロックを作成して2回目の初期化は行われません。

Class.forName('myClass).newInstance()の良い例は、あなたがオブジェクトを作成するために、ハードコードにクラス名を持っていないので、動的にクラスをインスタンス化する必要がある場合は、JDBCドライバ

Class.forName("com.mysql.JDBC.Driver").newInstance() 
+0

クラスを使用するとどうなりますか?inst1 =(クラス)Class.forName( 'myClass).getInstance()...... inst2 =(クラス)Class.forName(' myClass).getInstance()。 .............これは複数のインスタンスを正しく作成します。 – i2ijeya

+1

私はgetInstance()メソッドを見つけません。あなたは? – Nipuna

+0

が修正されました... – i2ijeya

4

Class.forName("your class name").newInstance()が便利です。

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

+0

素晴らしい!それは役に立つ応答です! –

-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(); 
} 
3

主な相違点は、Class.forName('your class name').newInstance()は動的であり、タイプはコードにハードコードする必要はないということです。

3

Class.forName("your class name").newInstance()あなたは、インスタンスがnewに似たクラスの仕事を形成取得したいときに使用していますが、jarファイルまたはリモートサーバにクラスからインスタンスを取得したいときに便利ですし、あなたがそれをインポートすることはできませんコンパイル時に

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

+1

JDBCの例はあまり良くありません。以前のバージョンのMySQL JDBCドライバでは 'newInstance()'を呼び出す必要がありました。 –

0

はのはcom.statckoverflow.Test

Class.forNameを想定してみましょう - それは、テストクラスをロードし、名前、パッケージ、コンストラクタ、注釈、メソッド、フィールドのようにテストクラスのメタデータを含むClassクラスオブジェクトを返します。

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

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

関連する問題