PHP中文网2017-04-18 10:51:58
すべてをロードするのではなく、オンデマンドでロードすると理解できます。
たとえば、継承された親クラス、実装されたインターフェイス、宣言された変数、メソッドの戻り値の型など。
つまり、現在のクラスを使用する場合、不足している必要なクラスはすぐにロードされます。
天蓬老师2017-04-18 10:51:58
オンデマンドでロードします。
クラスロードのタイミング:
1) new、getstatic、putstatic、または invokestatic の 4 つのバイトコード命令が発生したとき、クラスが初期化されていない場合は、最初にその初期化をトリガーする必要があります。これら 4 つの命令を生成する最も一般的な Java コード シナリオは次のとおりです。 new キーワードを使用してオブジェクトをインスタンス化するとき、クラスの静的フィールド (final によって変更され、結果はコンパイル時に定数プールに入れられる) の読み取りまたは設定を行うとき).フィールド)、およびクラスの静的メソッドを呼び出すとき。
2) java.lang.reflect パッケージのメソッドを使用してクラスへのリフレクション呼び出しを行う場合、クラスが初期化されていない場合は、最初にその初期化をトリガーする必要があります。
3) クラスを初期化するときに、その親クラスが初期化されていないことが判明した場合は、最初に親クラスの初期化をトリガーする必要があります。
4) 仮想マシンの起動時に、ユーザーは実行するメイン クラス (main() メソッドを含むクラス) を指定する必要があり、仮想マシンは最初にメイン クラスを初期化します。
5) JDK 1.7 の動的言語サポートを使用する場合、java.lang.invoke.MethodHandle インスタンスの最終解析結果が REF_getStatic、REF_putStatic、REF_invokeStatic のメソッド ハンドルであり、このメソッド ハンドルに対応するクラスがまだサポートされていない場合初期化された場合は、最初に初期化をトリガーする必要があります。
クラスの初期化をトリガーするこれらの 5 つのシナリオでは、仮想マシン仕様では非常に強力な修飾子「はいおよびのみ」が使用されます。これらの 5 つのシナリオの動作は、クラスへのアクティブ参照と呼ばれます。さらに、クラスを参照するすべてのメソッドは初期化をトリガーせず、受動的参照と呼ばれます。
出典: JVM 7.2 クラスロードのタイミングについての深い理解
巴扎黑2017-04-18 10:51:58
私はまだこれを深く理解していないので、他の人を誤解させることは敢えてしません。
仮想マシンの実行中に、java.lang パッケージの下にあるクラスなど、よく使用されるクラスがプリロードされることはわかっています。
プログラム内で参照するクラスファイル/jarパッケージに関しては、ロード処理が発生します。
仮想マシンがクラス ファイルを必要とする場合、デフォルトの classLoader.loadClass() を呼び出してロードします。このメソッドは、ロードされたクラスを最初に検索します。見つからない場合は、当然、そのクラスが返されます。それは親ローダーに渡されます。レイヤーごとに検索した後、classLoader は findClass メソッドを呼び出してファイルをロードします。
protected Class<?>loadClass(文字列名、ブール値解決)