詳細な分析システムとカスタムクラスローダ詳細なプラットフォーム固有のブートローダークラス
他のルートクラスローダとクラスローダ1.:
JVM起動クラスローダに組み込まjava.lang.ClassLoaderのおよびその他のJavaプラットフォームクラスをロードします。JVMは、特別なマシンコードの実行を開始したとき、それは、拡張クラスローダとクラスローダシステムをロードします。ブートローダーと呼ばれるマシンコードのこの特別なクラス(ブートストラップ)
他の人がJavaのクラスローダいる間スタートのクラスローダは、Javaクラスではなく、ブートローダーは、全体のロードプロセスを開くための責任があるクラス固有のマシン命令のプラットフォームです。
(ブートクラスローダを除く)すべてのクラスローダは、Javaクラスとして実装されています。しかし、常に最初の純粋なJavaクラス・ローダをロードし、全体のロード処理を円滑に進めることができるように、Javaクラス・ローダをロードする最初の成分を有する業務を開始するクラスローダです。
スタートクラスローダはjava.utilのとjava.langパッケージのクラスなどが含まれ、通常の動作に必要な基本的なコンポーネントのためのJREをロードするための責任を負うことになります
したがって:クラスローダ(システムクラスローダー)は、ルートクラスローダがロードされます!
System.out.println(ClassLoader.class.getClassLoader());
运行结果:
null
従って:ブートクラスローダーによって拡張クラスローダおよびシステムクラスローダは、(静的内部クラスAppClassLoader ExtClassLoaderをロードし、ランチャー、ランチャーAppClassLoaderはクラスローダをロード、クラスローダExtClassLoaderであるれています)
System.out.println(Launcher.class.getClassLoader());
运行结果:
null
2.ClassLoader.getSystemClassLoader()ソースコードの解釈:
委譲のためのシステムクラスローダーを返します。これは、新しいClassLoaderインスタンスのデフォルトの委譲の親で、通常、アプリケーションを起動するために使用されるクラスローダです。
委譲のためのシステムクラスローダーを返します。これは、デフォルトでは親の新しいクラスローダインスタンス、アプリケーションを起動するために使用され、通常はクラスローダを委託しています。
この方法は、まず、それが呼び出すスレッドのコンテキストクラスローダなどのシステムクラスローダとセットそれを作成した時点で、早期の実行時の起動シーケンス中に呼び出されます。
呼び出したときに、このメソッドの最初の実行は、初期の起動シーケンスでは、それはシステムクラスローダーを作成し、呼び出し元のスレッドのコンテキストクラスローダを設定します。
デフォルトのシステム・クラス・ローダは、[このクラス]の実装依存インスタンスです。
デフォルトのシステムクラスローダは、クラスの実装依存の一例です。
システムプロパティ「java.system.class.loader」が定義されている場合、このメソッドが最初に呼び出されたとき、そのプロパティの値は、システムクラスローダとして返されるクラスの名前であると解釈されます。このクラスは、デフォルトのシステムクラスローダーを使ってロードされ、委譲の親として使用されているClassLoader型の単一パラメータを取るpublicコンストラクタを定義する必要があります。インスタンスは、パラメータとして、デフォルトのシステムクラスローダでこのコンストラクタを使用して作成されます。得られたクラスローダは、システムクラスローダであると定義されます。
①あなたは、システムのプロパティ「java.system.class.loader」を定義した場合は名前がシステムクラスローダクラスとして返しますと、このメソッドが呼び出された最初の時間は、プロパティの値が扱われます。**②このクラスは、コンストラクタは、パラメータとして使用されるタイプの委譲クラスの親クラスローダを取り、デフォルトのクラスローダはシステムをロードするために、公共のコンストラクタを定義する必要があります。**そして、このコンストラクタはインスタンスを作成し使用し、パラメータとしてデフォルトクラスローダシステムを使用しています。クラスローダは、システムクラスローダとして定義されている生成 [クラスローダは、システム用のカスタムクラスローダを定義することです]。重要[すべての文泥棒!!!]
セキュリティマネージャが存在し、呼び出し元のクラスローダがnullでなく、呼び出し元のクラスローダが同じまたはシステムクラスローダの祖先でない場合、この方法は、のRuntimePermission(「のgetClassLoaderとセキュリティマネージャのcheckPermissionメソッドを呼び出しますシステムクラスローダへのアクセスを確認する「)許可。ない場合は、SecurityExceptionがスローされます。
そこセキュリティマネージャがあり、このメソッドはRuntimePermissionを使用して、呼び出し側のクラスローダが空ではなく、システムクラスローダークラスローダーは、同じ発信者またはないシステムクラスローダの祖先でない場合(「のgetClassLoader」 )システムクラスローダへのアクセスを確認するために、セキュリティマネージャのcheckPermissionメソッドを呼び出すためのアクセス許可。それ以外の場合は、SecurityExceptionをスローします。
戻り値:
委譲のためのシステムクラスローダがない場合はnull戻り値:委譲システムクラスローダ、またはどれも、返品は空ではありません。
3.カスタマイズシステムクラスローダ:「java.system.class.loader」セットで
-
システムクラスローダに提供さMyTest16カスタムクラスローダは、あなたが公共のコンストラクタを定義する必要があり、コンストラクタは、このパラメータに委譲クラスローダタイプとして親クラスを取る:( MyTest16.javaに追加コンストラクタ)
-
public MyTest16(ClassLoader parent){ super(parent); }
-
追加コンストラクタが存在しない場合には:
//将MyTest16作为系统类加载器去执行MyTest23 public static void main(String[] args) { System.out.println(System.getProperty("java.system.class.loader")); } ...\out\production\IdeaProject>java -Djava.system.class.loader=Jvm.MyTest16 Jvm.MyTest23 执行结果: Error occurred during initialization of VM java.lang.Error: java.lang.NoSuchMethodException: Jvm.MyTest16.<init>(java.lang.ClassLoader) at java.lang.ClassLoader.initSystemClassLoader(Unknown Source) at java.lang.ClassLoader.getSystemClassLoader(Unknown Source) Caused by: java.lang.NoSuchMethodException: Jvm.MyTest16.<init>(java.lang.ClassLoader)
-
コンストラクタを追加した後:
//将MyTest16作为系统类加载器去执行MyTest23 public static void main(String[] args) { System.out.println(System.getProperty("java.system.class.loader")); } ...\out\production\IdeaProject>java -Djava.system.class.loader=Jvm.MyTest16 Jvm.MyTest23 执行结果: Jvm.MyTest16
-
-
概要:明示的にシステムクラスローダーを指定するJava -Djava.system.class.loader = Jvm.MyTest16、MyTest16によって知ることができます
4.コンソールやターミナルで以下の結果を実行します。
public class MyTest23 {
public static void main(String[] args) {
System.out.println(System.getProperty("java.system.class.loader"));
System.out.println(MyTest23.class.getClassLoader());
System.out.println(MyTest16.class.getClassLoader());
System.out.println(ClassLoader.getSystemClassLoader());//打印系统类加载器
}
}
-
コンソールの結果::
null sun.misc.Launcher$AppClassLoader@18b4aac2 sun.misc.Launcher$AppClassLoader@18b4aac2 sun.misc.Launcher$AppClassLoader@18b4aac2 // app
-
ターミナルの結果:
Jvm.MyTest16 sun.misc.Launcher$AppClassLoader@18b4aac2 sun.misc.Launcher$AppClassLoader@18b4aac2 [null] //我这里不知道为什么是空,而老师讲的运行之后应该为:Jvm.MyTest16@.... //应该是MyTest16