[jvm] クラスローダーの分類

1. 説明
  • 1.jvm は、ブートストラップ クラスローダーとユーザー定義クラスローダーという 2 種類のクラス ローダーをサポートします。
  • 2. カスタム クラス ローダとは、一般的に開発者がプロ​​グラム内でカスタマイズしたクラス ローダを指しますが、Java 仮想マシンの仕様ではこのように定義されておらず、抽象クラス クラス ローダから派生したすべてのクラス ローダをカスタム クラス ローダに分割しています。
  • 3. プログラムにおいて最も一般的なクラスローダはブートクラスローダ、拡張クラスローダ、システムクラスローダ、カスタムクラスローダであり、これらは包含関係であり、上位下位関係や親クラスからの継承関係ではありません。
  • 4. ブート クラス ローダは C 言語で記述および実装されており、コードを取得できません。
2. 例
2.1 コード
package com.learning.classloader;

public class ClassLoaderLearning {
    public static void main(String[] args) {
        // 获取系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);

        // 获取其上层: 扩展类加载器
        ClassLoader extClassLoader = systemClassLoader.getParent();
        System.out.println(extClassLoader);

        // 试图获取其上层: 获取不到引导类加载器
        ClassLoader bootstrapClassLoader = extClassLoader.getParent();
        System.out.println(bootstrapClassLoader);

        // 对于用户自定义类型: 默认使用系统类加载器进行加载
        ClassLoader classLoader = ClassLoaderLearning.class.getClassLoader();
        System.out.println(classLoader);

        // String类型: 使用引导到加载器进行加载的,java的核心类库都是使用引导类加载器进行加载的
        ClassLoader stringClassLoader = String.class.getClassLoader();
        System.out.println(stringClassLoader);
    }
}
2.2 スクリーンショット

ここに画像の説明を挿入します

3. クラスローダーを起動します
  • 1. ブートストラップ クラスローダー、ブートストラップ クラスローダーとも呼ばれます
  • 2. スタートアップ クラス ローダーは C/C++ 言語で実装され、jvm 内にネストされます。
  • 3. Java のコア ライブラリ (パス java_home/jre/lib/rt.jar、resources.jar、または sun.boot.class.path にあるコンテンツ) をロードするために使用され、必要なクラスを提供するために使用されます。 jvm自体。
  • 4. java.lang.ClassLoader から継承せず、親ローダーがありません。
  • 5. 拡張クラスとアプリケーション クラス ローダーをロードし、それらを親クラス ローダーとして指定します。
  • 6. セキュリティ上の理由から、ブートストラップ起動クラスローダーは、パッケージ名が java、javax、sun などで始まるクラスのみをロードします。
4. 拡張クラスローダー
  • 1.拡張クラスローダー
  • 2. Java 言語で書かれ、sun.misc.Launcher$ExtClassLoader によって実装されます。
  • 3. ClassLoader クラスから派生
  • 4. 親クラスローダーは起動クラスローダーです
  • 5. java.ext.dirs システム プロパティで指定されたディレクトリからクラス ライブラリをロードするか、jdk security ディレクトリの jre/lib/ext サブディレクトリ (拡張ディレクトリ) からクラス ライブラリをロードします。ユーザーが作成した jar がこのディレクトリに配置されている場合、拡張クラス ローダーによって自動的にロードされます。
5. アプリケーションクラスローダー
  • 1.AppClassLoader
  • 2. Java 言語で書かれ、sun.misc.Launcher$AppClassLoader によって実装されます。
  • 3. ClassLoader クラスから派生
  • 4. 親クラスローダーは拡張クラスローダーです
  • 5. 環境変数 classpath またはシステム プロパティ java.class.path で指定されたパスにクラス ライブラリをロードします。
  • 6. このクラスローダは、プログラムのデフォルトのクラスローダであり、一般に、Java アプリケーションのクラスはこれによってロードされます。
  • 7. クラスローダーは、ClassLoader$getSystemClassLoader() メソッドを通じて取得できます。

おすすめ

転載: blog.csdn.net/qq_32088869/article/details/132257618