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() メソッドを通じて取得できます。