Java-Classloader-loadeClass(String,boolean)、findClass(String)クラスロードソース解析
3726 ワード
ここではクラスロードの手順をよりよく説明するために、サブコードの一部を削除し、興味があればClassloderソースコードを自分で表示することができます.
まず、クラス・ロードの手順を簡単に説明します. findLoadedClass(name)メソッドを使用して、クラスが ロードされているかどうかを確認します.クラスがロードされていない場合は、拡張クラスローダ である親ローダが呼び出される.拡張クラス・ローダは、親ローダが存在することがブート・クラス・ローダであるため、loadClassメソッドを実行する際にも、親ブート・クラス・ローダにロードを委任して を実行するClassLoaderクラスを継承します.がブートクラスローダの番になったとき、それはローダの最高レベルであり、親がいないため、彼は自身、すなわちブートクラスローダのクラスローダ方法 を呼び出す.ブートクラスがロードできない場合は、階層的に後退し、拡張クラスローダに渡されます.同様に、拡張クラスローダがロードできない場合は、アプリケーションクラスローダクラスに渡され、ロードできない場合は、最終的にはユーザー定義クラスローダに戻ってユーザー書き換えのfindClass(String)メソッド を実行します.
したがって、ユーザーがクラスローダをカスタマイズするときは、loadClassメソッドではなくfindClassメソッドを書き換える必要があります.
まず、クラス・ロードの手順を簡単に説明します.
したがって、ユーザーがクラスローダをカスタマイズするときは、loadClassメソッドではなくfindClassメソッドを書き換える必要があります.
protected Class> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
//
synchronized (getClassLoadingLock(name)) {
//
Class> c = findLoadedClass(name);
//
if (c == null) {
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
//
c = findClass(name);
}
}
// ,
if (resolve) {
resolveClass(c);
}
return c;
}
}
// java.lang.ClassLoader
// loadClass(String,boolean)
protected Class> findClass(String name) throws ClassNotFoundException {
throw new ClassNotFoundException(name);
}