2016-06-18 26 views
-2

私はクラスロードに関するいくつかの実験を行っていたので、私は以下のような簡単なコードを書いた。loadClassメソッドでfindLoadedClassメソッド呼び出しが必要なのはなぜですか?

CustomClass customClass1 = new CustomClass(); 
    CustomClass customClass2 = new CustomClass(); 

そして、それはすでに現在のローダによってロードされている場合は、最初のインスタンスの作成のために、それはloadClassメソッドに行って、findLoadedClassメソッドを呼び出したことに気づきました。そうではありませんでした。 しかし、2番目のインスタンスでは、loadClassメソッドには行かず、そのインスタンスを直接作成しました。

ここで私の質問は、クラスがすでにロードされているので、2番目のインスタンスを作成していたときに、loadClassメソッドには移動しなかったということです。したがって、jvmがすでにどのクラスがロードされているのか、どのクラスがロードされていないのか、loadClassメソッド内でfindLoadedClassメソッドが必要です。 (Javaの8用)Java仮想マシン仕様から

答えて

0

、セクション5.3.2:

以下のステップをロードし、それによってUSER-を用いてNで示される非配列クラスまたはインタフェースCを作成するために使用され最初に、Java仮想マシンは、Lが既にNで示されるクラスまたはインタフェースの開始ローダとして記録されているかどうかを判断します。存在する場合、このクラスまたはインタフェースはCであり、クラス作成はありません。必要。

それ以外の場合、Java仮想マシンはLでloadClass(N)を呼び出します。呼び出しによって返される値は、作成されたクラスまたはインタフェースCです。次に、Java仮想マシンはLがCの開始ローダーであることを記録します。 4)。

これは、あなたの例でloadClassが再び呼び出されない理由を説明しています。しかし、この特定のクラス 'fqnの特定のクラスローダーではloadClassが決して呼び出されないことを意味しません。たとえば、他のクラスローダが起動クラスローダとして機能するときに、クラスローディング委任のために発生する可能性がありますが、loadClassへの呼び出しをこのクラスローダのloadClassに委譲します。したがって、findLoadedClassへの呼び出し。

関連する問題