ホームページ >Java >&#&チュートリアル >Java クラスローダーとクラスロードプロセスの概要

Java クラスローダーとクラスロードプロセスの概要

王林
王林転載
2023-04-24 10:13:07879ブラウズ

1. クラスの読み込みプロセス

Java クラスローダーとクラスロードプロセスの概要

Loading

クラスの完全修飾名 (パッケージ名とクラス名) を使用してクラスを取得します。 ) .class ファイル、メタスペースにロードされます。

リンク

  • 検証:.class ファイルのセキュリティを確認してください

  • 準備:静的型変数にメモリを割り当て、デフォルト値を設定します

  • 解析:定数プール内のシンボル参照をダイレクトに変換しますReferences の場合、シンボル参照がアンロードされたクラス、またはアンロードされたクラスのフィールドまたはメソッドを指している場合、解析によってこのクラスのロードがトリガーされます。実行クラス コンストラクター メソッド init

    () プロセスは、クラスに親クラスがある場合、
  • jvm
によって親クラスの

init

が最初に実行されるようにします。そしてサブクラスが実行されます。

2. クラスローダー開始クラスローダー開始クラスローダーはC/C言語で実装されており、Javaをロードするために使用されます。コアクラスライブラリ。スタートアップ クラスは、パッケージ名が java、javax、および sun で始まるクラスのみをロードします。

拡張クラス ローダー

親クラス ローダーは、Java クラスローダーとクラスロードプロセスの概要スタートアップ クラス ローダー

です。

次の 2 つのディレクトリにクラス ライブラリをロードします:

java.ext.dirsDirectory

JDK インストール ディレクトリ:
    jre/lib/ext
  • ディレクトリ

    独自のパッケージを上記のディレクトリに置くと、自動的にロードされます。
  • アプリケーション クラス ローダー

    親クラス ローダーは 開始クラス ローダー

    で、
  • 環境変数 classpath
または

システム プロパティのロードを担当します。 java .class.path

指定されたパスの下のクラス ライブラリは、プログラムのデフォルトのクラス ローダーであり、Java プログラムのすべてのクラスはそれによってロードされます。

カスタム クラス ローダー

java.lang.ClassLoader クラスを継承し、findClass() メソッドをオーバーライドします。あまり複雑な要件がない場合は、URLClassLoader クラスを直接継承し、loadClass

メソッドをオーバーライドできます。

関数暗号化:

Java コードは、独自のコードを逆コンパイルする必要がある場合、簡単に逆コンパイルできます。逆コンパイルを防ぐには、まずコンパイルされたコードを特定の暗号化アルゴリズムで暗号化します。クラスが暗号化されると、Java の ClassLoader を使用してクラスをロードできなくなります。この場合、最初にクラスを復号化するように ClassLoader をカスタマイズする必要があります。クラスをロードするときに、 、そして再度ロードします。

非標準ソースからコードをロードする: バイトコードがデータベースまたはクラウドに配置されている場合は、指定されたソースからクラスをロードするようにクラス ローダーをカスタマイズできます。
  • 親委任モデル

    jvm は、クラス ファイルのオンデマンド ロード メソッドを使用します。クラスを使用する必要がある場合、jvm はそのクラス ファイルをロードします。クラスの生成メモリ内のオブジェクト。クラスをロードするときは、
  • 親委任メカニズム
  • が使用されます。

クラスローダー

クラスローディング リクエストを受信した場合、最初にロードせず、リクエストを に委任します。実行する親クラスローダー

  • #親クラスにまだ親クラス ローダーがある場合は、クラス ローダーを開始する: Bootstrap ClassLoader# まで上向きに委譲を続けます。 親クラス ローダーがロード タスクを完了できれば、成功した結果が返されます。親クラスがロードに失敗した場合、サブクラスは独自にロードを試行します。サブクラスがロードに失敗した場合は、 # がスローされます。 ##ClassNotFoundException例外、これは

    親委任モデル
  • 親委任モデルの破壊
  • #Usage:

    Java アプリケーションには多くのサービス プロバイダー インターフェイス (サービス プロバイダー インターフェイス、SPI) があり、これらのインターフェイスを使用すると、サードパーティが実装を提供できます。 SPI には JDBC、JNDI などが含まれます。これらの SPI インターフェイスは Java コア ライブラリに属し、通常は rt.jar パッケージに存在し、ブートストラップ クラス ローダーによってロードされます。 Bootstrap クラス ローダーは SPI 実装クラスを直接ロードできないため、他のクラス ローダーに委任してロードする必要があります。ただし、同じ名前のサービスが必要なため、親委任モデルを壊して、同じ名前の複数のクラスをロードする必要があります。

メソッド:

コンテキスト クラス ローダーを使用します
  • 再利用書き込み
  • loadClass
  • メソッド

以上がJava クラスローダーとクラスロードプロセスの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。