Javaクラスのロードについて
1.クラス・ロードの意味を理解する
クラスロードはJavaプログラムの実行の第一歩であり、クラスロードの研究は以下のように役立つ:1)JVMの実行過程を理解し、開発者により効果的な措置を取ってプログラムの実行に協力するように指導する.2)プログラムがクラスロードを動的に制御できるようにする.
2.クラス・ロードの一般的な手順
JAvaプログラムが実行される場所はメモリで、Java HelloWorldコマンドを実行すると、JVMは自動的にHelloWorld.classファイルをメモリにロードし、classのオブジェクトHelloWorld.classを形成します.クラスのロードプロセスは以下の通りです:1)、JREディレクトリを探し、jvm.dllを見つけ、JVMを初期化します.2)、Bootstrap Loader(起動クラスローダ)を生成します.追加の説明:Bootstrap LoaderはSystem.getProperty(「sun.boot.class.path」)で指定したパスまたはjarをロードします.3)、Bootstrap LoaderはExtented Loader(拡張クラスローダ)を自動的にロードし、親ローダをBootstrap Loaderに設定します.追加の説明:Extented LoaderがSystem.getProperty(「java.ext.dirs」)で指定したパスまたはjarをロードします.Javaを使用してプログラムを実行する場合は、java-Djava.ext.dirs=d:projectstestprojclasses HelloWorldなどの検索パスを指定することもできます.4)、Bootstrap LoaderはAppClass Loader(システムクラスローダ)を自動的にロードし、親ローダをExtented Loaderに設定します.追加の説明:AppClass LoaderはSystem.getProperty(「java.class.path」)で指定したパスまたはjarをロードします.Javaを使用してプログラムを実行する場合は、Java-cp./lavasoft/classes HelloWorld 5など、既存のClasspath設定を上書きするために-cpを追加し、AppClass LoaderによってHelloWorldクラスをロードすることもできます.追加の説明:ExtClassLoaderとAppClassLoaderは、JVMが起動すると、JVMに1部保存され、プログラムの実行中に検索パスを変更できません.実行時に他の検索パスからクラスをロードする場合は、新しいクラスローダを生成します.
3.クラスローダの特徴
1)、一つのプログラムを実行する時、いつもAppClass Loader(システムクラスローダ)によって指定されたクラスのロードを開始する.2)、クラスをロードすると、各クラスローダはロードタスクを親に渡し、親が見つからない場合は自分でロードします.3)、Bootstrap Loader(起動クラスローダ)は最上位クラスローダであり、その親ローダはnullである.
4.クラスロードの取得
印刷結果:
以上の結果から、ExtClassLoaderの親Loaderは取得されていないことが分かる.Bootstrap Loader(起動クラスローダ)はC言語で実現されているため、親Loaderに戻る確実な方法が見つからずnullに戻る.
原文Blog:http://blog.csdn.net/love_Javc_you/article/details/38081683
クラスロードはJavaプログラムの実行の第一歩であり、クラスロードの研究は以下のように役立つ:1)JVMの実行過程を理解し、開発者により効果的な措置を取ってプログラムの実行に協力するように指導する.2)プログラムがクラスロードを動的に制御できるようにする.
2.クラス・ロードの一般的な手順
JAvaプログラムが実行される場所はメモリで、Java HelloWorldコマンドを実行すると、JVMは自動的にHelloWorld.classファイルをメモリにロードし、classのオブジェクトHelloWorld.classを形成します.クラスのロードプロセスは以下の通りです:1)、JREディレクトリを探し、jvm.dllを見つけ、JVMを初期化します.2)、Bootstrap Loader(起動クラスローダ)を生成します.追加の説明:Bootstrap LoaderはSystem.getProperty(「sun.boot.class.path」)で指定したパスまたはjarをロードします.3)、Bootstrap LoaderはExtented Loader(拡張クラスローダ)を自動的にロードし、親ローダをBootstrap Loaderに設定します.追加の説明:Extented LoaderがSystem.getProperty(「java.ext.dirs」)で指定したパスまたはjarをロードします.Javaを使用してプログラムを実行する場合は、java-Djava.ext.dirs=d:projectstestprojclasses HelloWorldなどの検索パスを指定することもできます.4)、Bootstrap LoaderはAppClass Loader(システムクラスローダ)を自動的にロードし、親ローダをExtented Loaderに設定します.追加の説明:AppClass LoaderはSystem.getProperty(「java.class.path」)で指定したパスまたはjarをロードします.Javaを使用してプログラムを実行する場合は、Java-cp./lavasoft/classes HelloWorld 5など、既存のClasspath設定を上書きするために-cpを追加し、AppClass LoaderによってHelloWorldクラスをロードすることもできます.追加の説明:ExtClassLoaderとAppClassLoaderは、JVMが起動すると、JVMに1部保存され、プログラムの実行中に検索パスを変更できません.実行時に他の検索パスからクラスをロードする場合は、新しいクラスローダを生成します.
3.クラスローダの特徴
1)、一つのプログラムを実行する時、いつもAppClass Loader(システムクラスローダ)によって指定されたクラスのロードを開始する.2)、クラスをロードすると、各クラスローダはロードタスクを親に渡し、親が見つからない場合は自分でロードします.3)、Bootstrap Loader(起動クラスローダ)は最上位クラスローダであり、その親ローダはnullである.
4.クラスロードの取得
public class HelloWorld {
public static void main(String[] args) {
HelloWorld hello = new HelloWorld();
Class c = hello.getClass();
ClassLoader loader = c.getClassLoader();
System.out.println(loader);
System.out.println(loader.getParent());
System.out.println(loader.getParent().getParent());
}
}
印刷結果:
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
以上の結果から、ExtClassLoaderの親Loaderは取得されていないことが分かる.Bootstrap Loader(起動クラスローダ)はC言語で実現されているため、親Loaderに戻る確実な方法が見つからずnullに戻る.
原文Blog:http://blog.csdn.net/love_Javc_you/article/details/38081683