ホームページ Java &#&チュートリアル JAVAクラスロード機構の詳しい説明(推奨)

JAVAクラスロード機構の詳しい説明(推奨)

Dec 14, 2016 pm 05:30 PM

JAVA ソース コードのコンパイルは、次の 3 つのプロセスで構成されます。

1. ソース コードのコンパイル メカニズム。

2. クラスロードの仕組み

3. クラス実行の仕組み

ここでは主にコンパイルとクラスロードの2つの仕組みを紹介します。

1. ソースコードのコンパイル

コードのコンパイルは、JAVA ソースコード コンパイラーによって完了します。主な目的は、ソース コードをバイトコード ファイル (クラス ファイル) にコンパイルすることです。バイトコード ファイル形式は、主に定数プールとメソッド バイトコードの 2 つの部分に分かれています。

2. クラスのロード

クラスのライフサイクルは、仮想マシンのメモリにロードされることから始まり、メモリからアンロードされるときに終了します。プロセスには 7 つの段階があり、そのうち初期化前のすべての部分はクラスの読み込みに属します

読み込み----検証----準備----解析-----初期化----使用--- - --アンインストール

システムは、初めて使用するときに特定のクラスをロードする場合があります。または、特定の Java プログラムを実行するときに、特定のクラスをロードするためにプリロード メカニズムを使用する場合があります。開始、2 回 実行中の Java プログラムは 2 つの異なる JVM プロセスにあり、2 つの JVM 間でデータは共有されません。

1. 読み込みフェーズ

このプロセスの読み込みは、クラス読み込みメカニズムの段階です。この段階で完了する必要があるものは次のとおりです。

1) 完全修飾名を使用して取得します。クラスのこのクラスのバイナリ バイト ストリームを定義します。

2) このバイトストリームで表される静的ストレージ構造をメソッド領域のランタイムデータ構造に変換します。

3) メソッド領域のデータにアクセスする入り口として、このクラスを表す Class オブジェクトを Java ヒープに生成します。

最初のポイントでは、クラスのバイナリ バイト ストリームをどこでどのように取得するかが指定されていないため、この領域には開発者が取り組む余地が多く残されています。これについては、後のクラスローダーで紹介します。

2. 準備フェーズ

このフェーズでは、クラス変数 (static によって変更された変数) に正式にメモリを割り当て、クラス変数の初期値を設定します。このメモリ割り当てはメソッド領域で行われます。

1. インスタンス変数にはメモリが割り当てられないことに注意してください。オブジェクトがインスタンス化されると、インスタンス変数はオブジェクトとともに Java ヒープに割り当てられます。

2. ここで設定する初期値は通常、データ型のゼロ値を指します。

private static int a = 3;
このクラスの変数 a の値は、準備フェーズの後は 0 になります。変数 a への 3 の代入は、初期化フェーズで行われます。

3. 初期化フェーズ

初期化は、クラス読み込みメカニズムの最後のステップであり、この時点で、クラスで定義された JAVA プログラム コードの実行が実際に開始されます。前の準備段階で、クラス変数にはシステムに必要な初期値が割り当てられています。初期化段階で最も重要なことは、親間のさまざまなリソースの初期化の順序にあります。そして子供クラス。

Javaクラスでクラス変数の初期値を指定するには、2つの方法があります: 1. クラス変数の宣言時に初期値を指定します。 2. 静的初期化ブロックを使用してクラス変数の初期値を指定します。

初期化のタイミング

1) クラスインスタンスを作成するときは、1. new キーワードを使用してインスタンスを作成します。2. リフレクションによってインスタンスを作成します。3. 逆シリアル化によってインスタンスを作成します。

new Test();
Class.forName(“com.mengdd.Test”);
ログイン後にコピー

2) あるクラスのクラスメソッド(静的メソッド)を呼び出す

Test.doSomething();
ログイン後にコピー

3) あるクラスやインターフェースのクラス変数にアクセスする、またはこのクラスの変数に値を代入する。

int b=Test.a;
Test.a=b;
ログイン後にコピー

4) 特定のクラスのサブクラスを初期化します。サブクラスが初期化されると、そのサブクラスのすべての親クラスが初期化されます。

5) java.exe コマンドを直接使用してメインクラスを実行します。

クラスを自動的に初期化する上記のメソッドを除き、クラスにアクセスする他のメソッドはクラスの初期化をトリガーせず、パッシブ参照と呼ばれます。

1. サブクラスは親クラスの静的変数を参照します。これによりサブクラスは初期化されません。 rreeee executionの結果:supclassinit123

2 、このクラスの初期化はトリガーされません

public class SupClass
{
 public static int a = 123;
 static
 {
  System.out.println("supclass init");
 }
}
public class SubClass extends SupClass
{
 static
 {
  System.out.println("subclass init");
 }
}
public class Test
{
 public static void main(String[] args)
 {
  System.out.println(SubClass.a);
 }
}
ログイン後にコピー

実行結果:

MIGU

クラス変数がfinalで変更されると、その値はすでに決定されており、コンパイル時に定数プールに入れられます。このクラス変数にアクセスするときは、クラスを初期化せずに定数プールから直接取得することと同じです。

初期化の手順

1. クラスがロードされて接続されていない場合、プログラムは最初にクラスをロードして接続します。

2. このクラスの直接の親クラスがロードされていない場合は、最初にその直接の親クラスを初期化します。

3. クラスに初期化ステートメントがある場合、システムはこれらの初期化ステートメントを順番に実行します。

2 番目のステップでは、直接の親クラスに直接の親クラスがある場合、システムはこれらの 3 つのステップを再度繰り返して親クラスを初期化し、以下同様に JVM が最初に初期化するのは常に java.lang.Object です。クラス。 。プログラムが任意のクラスをアクティブに使用すると、システムはそのクラスとすべての親クラスが初期化されることを保証します。


上記は編集者が紹介した JAVA クラスのロード機構 (推奨) です。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。 !

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

2025年のトップ4 JavaScriptフレームワーク:React、Angular、Vue、Svelte 2025年のトップ4 JavaScriptフレームワーク:React、Angular、Vue、Svelte Mar 07, 2025 pm 06:09 PM

この記事では、2025年の上位4つのJavaScriptフレームワーク(React、Angular、Vue、Svelte)を分析し、パフォーマンス、スケーラビリティ、将来の見通しを比較します。 強力なコミュニティと生態系のためにすべてが支配的なままですが、彼らの相対的なポップ

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題修正 Spring Boot Snakeyaml 2.0 CVE-2022-1471問題修正 Mar 07, 2025 pm 05:52 PM

この記事では、リモートコードの実行を可能にする重大な欠陥であるSnakeyamlのCVE-2022-1471の脆弱性について説明します。 Snakeyaml 1.33以降のSpring Bootアプリケーションをアップグレードする方法は、このリスクを軽減する方法を詳述し、その依存関係のアップデートを強調しています

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? Mar 17, 2025 pm 05:44 PM

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Mar 17, 2025 pm 05:35 PM

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

node.js 20:キーパフォーマンスが向上し、新機能 node.js 20:キーパフォーマンスが向上し、新機能 Mar 07, 2025 pm 06:12 PM

node.js 20は、V8エンジンの改善、特により速いガベージコレクションとI/Oを介してパフォーマンスを大幅に向上させます。 新機能には、より良いWebセンブリのサポートと洗練されたデバッグツール、開発者の生産性とアプリケーション速度の向上が含まれます。

Iceberg:データレイクテーブルの未来 Iceberg:データレイクテーブルの未来 Mar 07, 2025 pm 06:31 PM

大規模な分析データセットのオープンテーブル形式であるIcebergは、データの湖のパフォーマンスとスケーラビリティを向上させます。 内部メタデータ管理を通じて、寄木細工/ORCの制限に対処し、効率的なスキーマの進化、タイムトラベル、同時wを可能にします

キュウリのステップ間でデータを共有する方法 キュウリのステップ間でデータを共有する方法 Mar 07, 2025 pm 05:55 PM

この記事では、キュウリの手順間でデータを共有する方法、シナリオコンテキスト、グローバル変数、引数の合格、およびデータ構造を比較する方法を調べます。 簡潔なコンテキストの使用、記述など、保守性のためのベストプラクティスを強調しています

Javaで機能的なプログラミング技術を実装するにはどうすればよいですか? Javaで機能的なプログラミング技術を実装するにはどうすればよいですか? Mar 11, 2025 pm 05:51 PM

この記事では、Lambda式、Streams API、メソッド参照、およびオプションを使用して、機能プログラミングをJavaに統合することを調べます。 それは、簡潔さと不変性を通じてコードの読みやすさと保守性の改善などの利点を強調しています

See all articles