クラスローダ【理解】

1708 ワード

クラスローダの役割
  • が担当する.classファイルをメモリにロードし、対応するjavaを生成する.lang.Classオブジェクト.クラスのロードメカニズムに過度に関心を持つ必要はありませんが、このメカニズムを理解すれば、プログラムの実行をよりよく理解することができます.

  • JVMのクラスローディングメカニズム
  • 全体の責任:クラスローダがクラスローダをロードする責任を負う場合、クラスローダが依存し参照する他のクラスローダもクラスローダによってロードされます.別のクラスローダを使用して
  • をロードすることを表示しない限り、クラスローダがロードされます.
  • 親委任:クラス・ローダがクラスをロードする責任を負う場合、親ローダにクラスをロードしようとします.親ローダがクラスをロードできない場合にのみ、自分のクラスパスからクラスをロードしようとします.
  • キャッシュメカニズム:ロードされたすべてのクラスがキャッシュされることを保証し、プログラムがクラスオブジェクトを使用する必要がある場合、クラスローダはまずキャッシュ領域からクラスを検索し、キャッシュ領域にクラスオブジェクトが存在しない場合にのみ、システムはクラスに対応するバイナリデータを読み出し、クラスオブジェクトに変換し、キャッシュ領域
  • に格納する.
    Javaに組み込まれたクラスローダ
  • Bootstrap class loader:仮想マシンの内蔵クラスローダで、通常nullとして表され、親null
  • はありません.
  • Platform class loader:プラットフォームクラスローダはすべてのプラットフォームクラスを見ることができます.プラットフォームクラスにはプラットフォームクラスローダまたはその祖先によって定義されたJava SEプラットフォームAPIが含まれています.
  • System class loader:プラットフォームクラスローダとは異なり、アプリケーションクラスローダとも呼ばれます.システムクラスローダは、通常、アプリケーションクラスパス、モジュールパス、およびJDK特定ツール上のクラス
  • を定義するために使用される.
  • クラスのローダの継承関係:Systemの親ローダはPlatform、Platformの親ローダはBootstrap
  • ClassLoaderの2つの方法
  • メソッド分類
    メソッド名
    説明
    static ClassLoader getSystemClassLoader()
    委任用のシステムクラスローダを返します
    ClassLoader getParent()
    親ローダに戻って委任
  • サンプルコード
  • public class ClassLoaderDemo {
        public static void main(String[] args) {
            //static ClassLoader getSystemClassLoader(): 
            ClassLoader c = ClassLoader.getSystemClassLoader();
            System.out.println(c); //AppClassLoader
    
            //ClassLoader getParent(): 
            ClassLoader c2 = c.getParent();
            System.out.println(c2); //PlatformClassLoader
    
            ClassLoader c3 = c2.getParent();
            System.out.println(c3); //null
        }
    }