JAva両親委託モードclassLoader

2559 ワード

プログラムが実行されている間に、システムの関連機能を呼び出すためにエントリ関数が呼び出されます.これらの機能は異なるclassに含まれています.1つのclassから他のclassを呼び出す方法が必要な場合があります.別のファイルが存在しない場合、システム異常が発生します.一方、プログラムが起動されると、プログラムが使用するすべてのclassファイルを一度にロードするのではなく、プログラムの必要に応じてJavaのクラスロードメカニズム(ClassLoader)によってあるclassファイルをメモリに動的にロードするのは、classファイルがメモリにロードされた後でのみ、他のclassに参照される.classLoadはclassをロードするために使用されます.
JAvaのデフォルトには3種類のclassLoaderがあります
1. Bootstrp loader
BootstrpローダはC++言語で書かれており、Java仮想マシンの起動後に初期化され、主に%JAVA_のロードを担当しています.HOME%/jre/lib、-Xbootclasspathパラメータで指定したパスと%JAVA_HOME%/jre/classesのクラス.すべてのcalsLoaderのparentでもあります.
2.Extension ClassLoader
拡張クラスローダと呼ばれ、Javaの拡張クラスライブラリのロードを担当し、デフォルトでJAVA_をロードします.HOME/jre/lib/ext/目次のjarすべて.
3.App ClassLoader
アプリケーションclasspathディレクトリの下にあるjarおよびclassファイルのすべてをロードするシステムクラスローダと呼ばれます.
ロードメカニズム
Java仮想マシンの起動後に初期化すると、Bootstrp loaderが初期化され、Bootstrp loaderがExtension ClassLoaderをロードし、最後にExtension ClassLoaderがApp ClassLoaderをロードし、階層化され、親子の関係が形成されます.クラスがロードされると、現在のレベルでクラスがすでに存在するかどうかを判断し、存在する場合はクラスのインスタンスを返し、存在しない場合はBootstrp loaderに達するまで親クラスで検索します.
loadClassのコードを貼り付ける

 protected synchronized Class> loadClass(String name, boolean resolve) throws ClassNotFoundException
        {
            {
                try {
                    if (parent != null) {   //             
                        c = parent.loadClass(name, false);    
                    } else {
                        c = findBootstrapClass0(name);//         ,   bootstrap           } 
                    } catch (ClassNotFoundException e) {

                        c = findClass(name);//           ,   findClass   。      } 
                    }
                    if (resolve)
                    {
                        resolveClass(c);
                    }
                    return c;
                }
    }

ここでは、なぜこのような方法でロードするのか、classLoaderをカスタマイズするときにBootstrp loaderに触れないのか、Bootstrp loaderのクラスが自分の姿を保つことを保証しているのか、Stringクラスを書くと、親クラスがこのクラスを見つけて戻ってきて、システムのStringを使用していることを保証しています.他の悪意によって破壊されない.