ClassLoader学習
1
クラスをロードする3つの方法
newキーワードを使用してクラスローダに必要なクラスjavaを必要に応じてロードする.lang.ClassのforName()メソッドjavaをロードします.lang.ClassLoaderのloadClass()メソッドのロード
2
Classの方法
public static Class forName(String className)
public static Class forName(String className,boolean initialize,ClassLoader loader)パラメータ説明:className-必要なクラスの完全限定名initialize-クラス(静的コードブロックの初期化)loaderを初期化する必要があるかどうか-クラスをロードするクラスローダ呼び出しに1つのパラメータしかないforName()メソッドはClassに等しい.forName(className, true, loader).
ClassLoaderの方法
public Class loadClass(String name) protected Class loadClass(String name, boolean resolve)
パラメータの説明:
resolveは、クラスをロードするときに接続するかどうかを設定するために使用されます.
引数が1つしかないloadClass()メソッドを呼び出すのは、loadClass(className,false)と同等です.
しかもpublicの
このことからわかる
デフォルトではforNameがloadClassを初期化しても初期化されません
これもJDBCでforNameでloadClassを使わないしかない理由です
3
JVMでクラスをロードする場合は、3つのステップを経て、マウント、接続、初期化する必要があります.マウントとは、対応するclassファイルを見つけ、JVMを読み込み、初期化はもちろん、接続について最も重要なことです.接続は3つのステップに分けられ、最初のステップはclassが仕様に合致しているかどうかを検証することであり、2番目のステップは準備であり、クラス変数にメモリを割り当てながらデフォルトの初期値を設定することであり、3番目のステップは解釈であり、このステップはオプションであり、上記のloadClassメソッドの2番目のパラメータに基づいて解釈が必要かどうかを判定する
4
5
a,Bootstrap ClassLoader/起動クラスローダは主にjdk_を担当するhome/libディレクトリのコアapiまたは-Xbootclasspathオプションで指定するjarパッケージワーク.b,Extension ClassLoader/拡張クラスローダは主にjdk_を担当するhome/lib/extディレクトリのjarパッケージまたは-Djava.ext.dirs指定ディレクトリの下のjarは作業cに包装され、System ClassLoader/システムクラスローダは主にjava-classpath/-Djavaを担当する.class.pathが指すディレクトリの下のクラスとjarの包装作業.b,User Custom ClassLoader/ユーザカスタムクラスローダ(java.lang.ClassLoaderのサブクラス)プログラム実行中にjava.lang.ClassLoaderのサブクラスはclassファイルを動的にロードし、javaの動的リアルタイムクラスのロード特性を体現する.の起動順序はabcdである.少なくともaはjavaで書かれた ではない. abcdは継承関係であり、aはbの親 である.クラスをロードするときは、親委任を採用します.
すなわち、システムクラスローダであれば、拡張クラスローダに委任し、拡張クラスローダを起動クラスローダに委任する
起動クラス・ローダが見つからない場合は、拡張クラス・ローダに配布されると、拡張クラス・ローダが見つからず、システム・クラス・ローダに戻ります.
リファレンス
http://www.iteye.com/topic/83978
クラスをロードする3つの方法
newキーワードを使用してクラスローダに必要なクラスjavaを必要に応じてロードする.lang.ClassのforName()メソッドjavaをロードします.lang.ClassLoaderのloadClass()メソッドのロード
2
Classの方法
public static Class forName(String className)
public static Class forName(String className,boolean initialize,ClassLoader loader)パラメータ説明:className-必要なクラスの完全限定名initialize-クラス(静的コードブロックの初期化)loaderを初期化する必要があるかどうか-クラスをロードするクラスローダ呼び出しに1つのパラメータしかないforName()メソッドはClassに等しい.forName(className, true, loader).
ClassLoaderの方法
public Class loadClass(String name) protected Class loadClass(String name, boolean resolve)
パラメータの説明:
resolveは、クラスをロードするときに接続するかどうかを設定するために使用されます.
引数が1つしかないloadClass()メソッドを呼び出すのは、loadClass(className,false)と同等です.
しかもpublicの
このことからわかる
デフォルトではforNameがloadClassを初期化しても初期化されません
これもJDBCでforNameでloadClassを使わないしかない理由です
3
JVMでクラスをロードする場合は、3つのステップを経て、マウント、接続、初期化する必要があります.マウントとは、対応するclassファイルを見つけ、JVMを読み込み、初期化はもちろん、接続について最も重要なことです.接続は3つのステップに分けられ、最初のステップはclassが仕様に合致しているかどうかを検証することであり、2番目のステップは準備であり、クラス変数にメモリを割り当てながらデフォルトの初期値を設定することであり、3番目のステップは解釈であり、このステップはオプションであり、上記のloadClassメソッドの2番目のパラメータに基づいて解釈が必要かどうかを判定する
4
ClassLoader loader = obj.getClass().getClassLoader();
Class clazzA = loader.loadClass(AAA);
5
a,Bootstrap ClassLoader/起動クラスローダは主にjdk_を担当するhome/libディレクトリのコアapiまたは-Xbootclasspathオプションで指定するjarパッケージワーク.b,Extension ClassLoader/拡張クラスローダは主にjdk_を担当するhome/lib/extディレクトリのjarパッケージまたは-Djava.ext.dirs指定ディレクトリの下のjarは作業cに包装され、System ClassLoader/システムクラスローダは主にjava-classpath/-Djavaを担当する.class.pathが指すディレクトリの下のクラスとjarの包装作業.b,User Custom ClassLoader/ユーザカスタムクラスローダ(java.lang.ClassLoaderのサブクラス)プログラム実行中にjava.lang.ClassLoaderのサブクラスはclassファイルを動的にロードし、javaの動的リアルタイムクラスのロード特性を体現する.
すなわち、システムクラスローダであれば、拡張クラスローダに委任し、拡張クラスローダを起動クラスローダに委任する
起動クラス・ローダが見つからない場合は、拡張クラス・ローダに配布されると、拡張クラス・ローダが見つからず、システム・クラス・ローダに戻ります.
リファレンス
http://www.iteye.com/topic/83978