クラスローダー
Javaクラスローダーは、実行時にJVMに必要なクラスを動的にロードすることです。 Javaクラスローダーは、委任、可視、および単一の3つのメカニズムに基づいています。
ClassPathの下の.classファイルをメモリにロードし、それらをbytecodeに処理します。これらのタスクは、クラスローダーによって行われます。
デフォルトのクラスローダー
システムはデフォルトで3つのクラスローダーがあります。
クラスローダーもJavaクラスですが、ブートストラップはそうではありません。検証コード:
public class classloadertest {public static void main(string [] args){system.out.println(system.class.getClassLoader()); }}出力:null
system.out.println(system.class.getClassLoader()。toString);使用されると、ヌルポインターの例外が報告されています。
com.iot.classloader.classloadertest.main(classloadertest.java:10)のsun.reflt.nativemethodaccessorimpl.invoke0(classloadertest.java:10)のcom.iot.classertest.mainのスレッド "main.lang.nullpointerexceptionの例外sun.reflect.delegatingmethodaccessorimpl.invoke(DelegatingMethodaccessorimpl.java:43)at java.lang.reflt.method.invoke(Method.java:483)at Com.intellij.rt.execution.Application.Appmain.main.Java:14)
ご覧のとおり、システムクラスはブートストラップクラスローダーによってロードされます。
クラスローダー委任メカニズム
クラスローダーのツリー図
クラスローダー
ロードクラスの一般的な順序:
カスタムクラスローダーの書き方
API:
クラスクラスローダー
テンプレートメソッド設計パターン
親クラス:
LoadClass(クラスの読み込みプロセス、テンプレート)
LoadClassメソッドによって呼び出されるサブクラスオーバーライドのクラスロードロジックを検索します。
defineclass get classファイルはbytecodeに変換されます
サブクラス:FindClassメソッドをオーバーライドします
例:
ロードクラスメソッドのソースコード
保護されたクラス<?> loadclass(string name、boolean resolve)classNotFoundException {synchronized(getClassLoadingLock(name)){//最初に、クラスがすでにロードされているかどうかを確認します<? if(c == null){long t0 = system.nanotime(); try {if(parent!= null){c = parent.loadclass(name、false); } else {c = findbootstrapclassornull(name); }} catch(classNotFoundException e){// classNotFoundException classが見つかった場合はスローされます。 long t1 = system.nanotime(); c = findclass(name); //これは定義するクラスローダーです。 stats sun.misc.perfcounter.getParentDelegationTime()を記録します。 sun.misc.perfcounter.getfindclasstime()。addelapsedtimefrom(T1); sun.misc.perfcounter.getFindclasses()。increment(); }} if(resolve){resolveclass(c); } return c; }}APIドキュメントの例:
クラスNetworkClassLoaderはclassLoaderを拡張します{String HOST; intポート; public class findclass(string name){byte [] b = loadclassdata(name); Return Defionclass(name、b、0、b.length); } private byte [] loadclassdata(string name){//接続からクラスデータをロードします。 。 。 }}