2016-04-17 4 views
0

それは<JAVA_HOME>/JRE/libディレクトリ内のjarファイルがない、ブートストラップクラスローダによってロードされたのはなぜ

ブートストラップクラスローダが<JAVA_HOME>/JRE/libディレクトリに位置するコアJavaライブラリをロードすると言われています。

そして

拡張クラスローダは、拡張ディレクトリ<JAVA_HOME>/JRE/libに/ extに、またはのjava.ext.dirsシステムプロパティで指定された他のディレクトリ)内のコードをロードします。これはsun.misc.Launcher $ ExtClassLoaderクラスによって実装されています。

今私のメインプログラムが

public class TestSt { 

    public static void main(String[] args) { 

     System.out.println(String.class.getClassLoader()); 
     System.out.println(Student.class.getClassLoader()); 
     System.out.println(TestSt.class.getClassLoader()); 
    } 

} 

であれば出力は

あるヌル
[email protected] [email protected]

これは問題ありません。

今、私はlibに/ JRE /で学生のJarファイルを置く/ EXT出力は

ヌル
[email protected] [email protected]

ある場合

どちらも問題ありません。

私はstudent jarファイルを
/jre/libディレクトリに配置すると分かりませんでした。出力は
[email protected] [email protected]

ヌルとして

を与えているのはなぜ私が考えていた、この場合では学生のクラスブートストラップクラスローダーからロードする必要があります。アプリケーションクラスローダーによってロードされるのはなぜですか。私は何かが足りないと思う。私が間違っている場所を教えてください。

+0

ExtClassLoaderを使用してクラスを 'ext'ディレクトリにロードする理由は何ですか? –

+0

いいえ、私はbootstrapクラスローダーがjre/lib /ディレクトリ内に配置されたクラスをロードしない理由を尋ねています – Roshan

答えて

2

すべてのJARが自動的にロードされるディレクトリはわずかです。 /jre/libなどのディレクトリでは、ロードすると予想されるJARのみがロードされます。他のJARはクラスパス経由でロードする必要があります。

+1

bootstarpクラスローダのようなものは、rt.jar内のクラスのようにJVMによって内部的に提供されるクラスだけをロードします。 – Roshan

+0

@Roshanはい.... –

+0

私のコンセプトをクリアするための@peterに感謝 – Roshan