Javaクラスロードメカニズム(一):クラスローダとその対応するロードパス
5858 ワード
この問題を議論する前に、Javaの2つの重要な環境変数を見てみましょう.PathとCLASSSPATHです.
PathとCLASSSPATH
Windows環境変数のPathは、Windowsの実行可能ファイルを示すパスです.JDKのインストールでは、通常、Pathの環境変数にjavaの実行可能ファイルパス%JAVA_を追加する必要があります.HOME%binは、実行可能ファイルが存在するパスを追加することなく、コマンドラインでjava、javacなどのコマンドを直接使用できます.
CLASSSPATH環境変数は、classファイルのロード時の検索パスを指定します.CLASSSPATHの意味は次の例で説明します.
Javaの3種類のローダとそれに対応するロードパス
Javaクラスのロードメカニズムを理解すると、Javaは3つのクラスローダを提供しています.起動クラスローダ、拡張クラスローダ、アプリケーションクラスローダです.それぞれ、異なるパスの下にあるクラスライブラリのロードを担当します.eclipseでは、次のプログラムでそれぞれのロードパスを印刷します.
印刷結果は次のとおりです.
起動クラスローダのロードパスは%JAVA_HOME/jre、拡張クラスローダのロードパスは%JAVA_HOME/jre/lib/extで、アプリケーションクラスローダのロードパスはeclipseエンジニアリングのクラスライブラリです.コマンドラインから直接ClassLoaderTest.javaファイルをコンパイルして実行した場合、印刷結果は次のようになります.
次のことがわかります.
(1)起動クラスローダと拡張クラスローダのロードパスは変化しない.クラスローダの起動JAVA_のロードHOME/jreのコアクラスライブラリ、拡張クラスローダJAVA_をロードHOME/jre/lib/extでの拡張クラスライブラリ
(2)eclipseは、そのエンジニアリングのCLASSSPATHをこのエンジニアリング固有のクラスライブラリパスとして設定し、コマンドラインで直接コンパイルして実行すると、環境変数CLASSSPATHの値となるため、アプリケーションクラスローダのロードパスが変化する.したがってjavaが提供するアプリケーションクラスローダはCLASSSPATHのクラスライブラリのロードを担当しており、ユーザープログラムが独自のクラスローダをカスタマイズしていない場合、ユーザークラスは一般的にアプリケーションクラスローダによってロードされることがわかります.
参考文献
https://blog.csdn.net/irelandken/article/details/7048817
PathとCLASSSPATH
Windows環境変数のPathは、Windowsの実行可能ファイルを示すパスです.JDKのインストールでは、通常、Pathの環境変数にjavaの実行可能ファイルパス%JAVA_を追加する必要があります.HOME%binは、実行可能ファイルが存在するパスを追加することなく、コマンドラインでjava、javacなどのコマンドを直接使用できます.
CLASSSPATH環境変数は、classファイルのロード時の検索パスを指定します.CLASSSPATHの意味は次の例で説明します.
Javaの3種類のローダとそれに対応するロードパス
Javaクラスのロードメカニズムを理解すると、Javaは3つのクラスローダを提供しています.起動クラスローダ、拡張クラスローダ、アプリケーションクラスローダです.それぞれ、異なるパスの下にあるクラスライブラリのロードを担当します.eclipseでは、次のプログラムでそれぞれのロードパスを印刷します.
package com.curry.classload;
import java.net.URL;
import java.net.URLClassLoader;
public class ClassLoaderTest {
public static void main(String[] args)
{
System.out.println("BootstrapClassLoader : ");
//String[] bootUrls = System.getProperty("sun.boot.class.path").split(";");
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
for(URL url : urls)
System.out.println(url);
System.out.println("----------------------------");
//
URLClassLoader extClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader().getParent();
System.out.println(extClassLoader);
System.out.println(" : ");
urls = extClassLoader.getURLs();
for(URL url : urls)
System.out.println(url);
System.out.println("----------------------------");
// ( )
URLClassLoader appClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
System.out.println(appClassLoader);
System.out.println(" ( ) : ");
urls = appClassLoader.getURLs();
for(URL url : urls)
System.out.println(url);
System.out.println("----------------------------");
}
}
印刷結果は次のとおりです.
BootstrapClassLoader :
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/resources.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/rt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/sunrsasign.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/jsse.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/jce.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/charsets.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/jfr.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/classes
----------------------------
sun.misc.Launcher$ExtClassLoader@15db9742
:
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/access-bridge-64.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/cldrdata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/dnsns.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/jaccess.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/jfxrt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/localedata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/nashorn.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/sunec.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/sunjce_provider.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/sunmscapi.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/sunpkcs11.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/zipfs.jar
----------------------------
sun.misc.Launcher$AppClassLoader@73d16e93
( ) :
file:/C:/Users/Welcome/Documents/Eclipse/JVMInPractice/bin/
----------------------------
起動クラスローダのロードパスは%JAVA_HOME/jre、拡張クラスローダのロードパスは%JAVA_HOME/jre/lib/extで、アプリケーションクラスローダのロードパスはeclipseエンジニアリングのクラスライブラリです.コマンドラインから直接ClassLoaderTest.javaファイルをコンパイルして実行した場合、印刷結果は次のようになります.
BootstrapClassLoader's load path:
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/resources.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/rt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/sunrsasign.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/jsse.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/jce.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/charsets.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/jfr.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/classes
----------------------------
sun.misc.Launcher$ExtClassLoader@15db9742
extClassLoader's load path:
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/access-bridge-64.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/cldrdata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/dnsns.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/jaccess.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/jfxrt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/localedata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/nashorn.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/sunec.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/sunjce_provider.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/sunmscapi.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/sunpkcs11.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/ext/zipfs.jar
----------------------------
sun.misc.Launcher$AppClassLoader@73d16e93
application classloader's load path:
file:/C:/Users/Welcome/Desktop/java/thought_oN_JVM/
file:/C:/Program%20Files/Java/jdk1.8.0_121/lib/dt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_121/lib/tools.jar
----------------------------
次のことがわかります.
(1)起動クラスローダと拡張クラスローダのロードパスは変化しない.クラスローダの起動JAVA_のロードHOME/jreのコアクラスライブラリ、拡張クラスローダJAVA_をロードHOME/jre/lib/extでの拡張クラスライブラリ
(2)eclipseは、そのエンジニアリングのCLASSSPATHをこのエンジニアリング固有のクラスライブラリパスとして設定し、コマンドラインで直接コンパイルして実行すると、環境変数CLASSSPATHの値となるため、アプリケーションクラスローダのロードパスが変化する.したがってjavaが提供するアプリケーションクラスローダはCLASSSPATHのクラスライブラリのロードを担当しており、ユーザープログラムが独自のクラスローダをカスタマイズしていない場合、ユーザークラスは一般的にアプリケーションクラスローダによってロードされることがわかります.
参考文献
https://blog.csdn.net/irelandken/article/details/7048817