JVMクラス親委任モデルのロード
2062 ワード
親委任モデル
≪ワーク・プロシージャ|Work Procedure|emdw≫:クラス・ローダがクラス・ローディングのリクエストを受信した場合、まずこのリクエストを親のクラス・ローダに委任して完了します.各階層のクラス・ローダはそうです.そのため、すべてのロード・リクエストは最上位の起動クラス・ローダに転送する必要があります.親ローダがこのロード要求を完了できないとフィードバックした場合(検索範囲に必要なクラスが見つからない場合)、サブローダは自分でロードしようとします.
メリット:javaクラスは、クラスローダとともに優先度のある階層関係を備えています.例えばクラスjava.lang.Object.はrt.jarに格納され、どのクラス・ローダがこのクラスをロードするにしても、最終的には起動クラス・ローダにロードされるため、Objectクラスはプログラムの様々なクラス・ローダ環境で同じクラスになります.逆に、ユーザーがjavaという名前を自分で書いた場合.lang.Objectのクラスが、プログラムのClasspathに置かれると、システムには複数の異なるObjectクラスが現れ、javaタイプのシステムで最も基礎的な動作も保証されず、アプリケーションも混乱します.
コード:
≪ワーク・プロシージャ|Work Procedure|emdw≫:クラス・ローダがクラス・ローディングのリクエストを受信した場合、まずこのリクエストを親のクラス・ローダに委任して完了します.各階層のクラス・ローダはそうです.そのため、すべてのロード・リクエストは最上位の起動クラス・ローダに転送する必要があります.親ローダがこのロード要求を完了できないとフィードバックした場合(検索範囲に必要なクラスが見つからない場合)、サブローダは自分でロードしようとします.
メリット:javaクラスは、クラスローダとともに優先度のある階層関係を備えています.例えばクラスjava.lang.Object.はrt.jarに格納され、どのクラス・ローダがこのクラスをロードするにしても、最終的には起動クラス・ローダにロードされるため、Objectクラスはプログラムの様々なクラス・ローダ環境で同じクラスになります.逆に、ユーザーがjavaという名前を自分で書いた場合.lang.Objectのクラスが、プログラムのClasspathに置かれると、システムには複数の異なるObjectクラスが現れ、javaタイプのシステムで最も基礎的な動作も保証されず、アプリケーションも混乱します.
コード:
protected Class> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class c = findLoadedClass(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 thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
long t1 = System.nanoTime();
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}