2016-06-16 10 views
1

現在、クラスローダーとその階層機能を読み込み中です。 私はコードの下に呼び出す場合 - 私の理解あたりとしてClass.forName()を2回呼び出す

ClassA a= Class.forName("com.test.ClassA") 

、今ではアプリケーションクラスローダの助けを借りて、メモリに初期化され、ロードされます。 私は以下の質問があります:

  1. 上記のコードをもう一度呼び出すとどうなりますか? 'ClassA'のためにメモリに新しいインスタンスが作成されるのでしょうか、それとも同じロードされたクラス参照を返しますか?それを使用することになりますどのような 「あなたはまた、複数のソースから同じクラスをロードすることができ、彼らはJVMに別のクラスとして扱われる別々のクラスローダを使用することにより」javarevisitedのこのあたりpostとして
  2. YESの場合、?
+3

BTW: 'Class.forName'は、forNameで渡されたクラスのインスタンスではなく、' Class'型のオブジェクトを返します。 'ClassA a = Class.forName(" com.test.ClassA ")'は間違っています。これは 'Class a = Class.forName(" com.test.ClassA ")' –

答えて

4
  1. あなたは同じクラスを取得します。ちょうどそれをテストします。 2回目にロードして、a1 == a2かどうかを確認します。
  2. この機能の最も頻繁な使用は、おそらくアプリケーションサーバーにあります.1つのサーバーに複数のWebアプリケーションを展開でき、すべて同じクラスを使用できます。しかし、静的変数を共有すべきではありません。また、ライブラリ1.0のクラスFooを使用し、ライブラリ2.0のクラスFooを使用する場合は、問題はありません。したがって、異なるクラスローダーで同じクラスをロードする必要があります。
1
  1. 新しいインスタンスを呼び出す場合にのみ作成されます。

    にClassAのインスト=新にClassA();

クラス定義(メタデータとバイトコード)は、JVMのHEAPという管理対象メモリの特別なセクションにロードされます。通常、アプリケーションはクラスをJVMにプリロードするためにこの関数を使用します。そのため、後でアプリケーションが必要とする待ち時間はありません。

  1. たとえば、hotdeployが使用されます。あなたはJava Webサーバーをデバッグしています。間違いを見つけ、アプリケーション全体ではなく、1つのクラスを変更(リロード)したいだけです。ここでの重要な点は、「異なるクラスローダ」です。つまり、javaのライブラリはjar、war(アーカイブ)、データベース、ネットワークからさまざまなソースから読み込むことができます。これをWindowsのCOMモデルと比較します。ここでは、ライブラリは同じフォルダまたは/ system32 /フォルダになければなりません。
関連する問題