Java クラスのロード プロセス
# 最初はロード プロセス (Loading) です。これは、Java がさまざまなデータ ソースからバイトコード データを読み取るプロセスです。 JVM に変換し、JVM によって認識されるデータ構造 (クラス オブジェクト) にマッピングします。ここでのデータ ソースは、jar ファイル、クラス ファイル、さらにはネットワーク データ ソースなど、さまざまな形式になります。入力データがClassFile 構造体の場合、ClassFormatError がスローされます。ロード段階はユーザーが参加する段階であり、クラスローダーをカスタマイズして独自のクラスロードプロセスを実装できます。
2 番目の段階はリンクであり、これは核となるステップであり、簡単に言うと、元のクラス定義情報を JVM 実行プロセスにスムーズに転送することです。 1. 検証 (仮想マシンのセキュリティの重要な保証です) JVM は、バイト情報が Java 仮想マシンの仕様に準拠していることを検証する必要があります。そうでない場合は、VerifyError とみなされます。悪意のある情報や準拠していない情報が JVM の動作に悪影響を与える場合、検証フェーズでさらに多くのクラスのロードがトリガーされる可能性があります。 2.準備(Perepation)では、クラスまたはインターフェースに静的変数を作成し、静的変数の初期値を初期化します。ただし、ここでの「初期化」と以下の表示初期化フェーズには違いがあり、必要なメモリ領域を割り当てることに重点が置かれており、それ以上の JVM 命令は実行されません。 3. 解決策: このステップでは、定数プール内のシンボリック参照が直接参照に置き換えられます。 Java 仮想マシン仕様では、クラス、インターフェイス、メソッド、フィールドなどのさまざまな側面の分析が詳細に紹介されています。
最後のステップは初期化フェーズ (初期化) です。このステップでは、静的フィールド割り当てのアクションやクラス内の静的初期化ブロック内のロジックの実行など、クラス初期化のコード ロジックが実際に実行されます。コンパイラがコンパイル フェーズを実行する ロジックのこの部分が整理され、親型の初期化ロジックが現在の型のロジックより優先されます。親委任モデルについて話しましょう 簡単に言うと、ローダー (クラスローダー) が特定の型をロードしようとするとき、親クラス ローダーが対応する型を見つけられない限り、タスクを現在のローダーの親に委任しようとします。それを行うためのツール。委任モデルを使用する目的は、Java 型の繰り返しロードを回避することです。
カスタム クラス ローダーの一般的なシナリオ
同様のプロセス内分離を実現するために、クラス ローダーは実際には別の名前空間として使用され、同様のコンテナーを提供します。とモジュールの変換効果。例: 1. 2 つのモジュールは、特定のクラス ライブラリの異なるバージョンに依存しており、異なるコンテナーによって読み込まれても、相互に干渉しません。この分野のマスターは、Java EE、OSGL、JPMS、およびその他のフレームワークです。 2. アプリケーションは、ローカル ファイル システムではなくネットワーク データ ソースなど、さまざまなデータ ソースからクラス定義情報を取得する必要があります。 3. または、バイトコードを自分で操作し、生成された型を動的に変更する必要があります。
カスタム クラスの読み込みプロセスは、一般に単純に理解できます: 1. 名前を指定してバイナリ実装を見つけます。これは、多くの場合、カスタム クラス ローダーが、たとえば特定のデータ内で「カスタマイズ」する部分です。ソース 名前でバイトコードを取得するか、バイトコードを変更または生成します。 2. 次に、Class オブジェクトを作成し、クラスの読み込みプロセスを完了します。バイナリ情報のクラス オブジェクトへの変換は通常、defineClass に依存しますが、自分で実装する必要はなく、最終的なメソッドです。 Class オブジェクトを使用すると、その後の読み込み処理がスムーズに完了します。
推奨チュートリアル: 「Java チュートリアル 」
以上がJavaクラスのロード処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。