JVM---クラスローダ
2260 ワード
まずclassloaderのロードコードを見てみましょう:public abstract class ClassLoader
ExtClassLoaderとAppClassLoaderはjavaです.net.URLClassLoaderのサブカテゴリです.java起動プログラムを使用する場合、ExtClassLoaderの検索パスを指定するには、次のコマンドを使用します.java-Djava.ext.dirs=c:/workspace/YourClass java起動プログラムを使用する場合、-classpathまたは-cpを使用してAppClassLoaderの検索パスを指定します.つまり、Classpath:java-classpath c:/workspace/YourClass ExtClassLoaderとAppClassLoaderはプログラム起動後にダミーマシンに存在します.プログラム実行中に検索パスを変更することはできません.プログラム実行中に他のパスからカテゴリを読み込むことを動的に決定するには、新しいカテゴリローダを生成します.URLClassLoaderを使用すると、javaが必要な新しいカテゴリ・ローダを生成できます.net.URLはそのパラメータとしてカテゴリロードの検索パスを指定します.例えば、URL url 1=new URL(「file:/d:/workspace/」);URLClassLoader urlClassLoader1 = new URLClassLoader(new URL[] {url1}); Class c1 = urlClassLoader1.loadClass("ClassDemoTest"); ClassLoaderを追加すると、そのloadClass()メソッドを使用してロードするカテゴリ名を指定できます.ClassLoaderを追加すると、追加したClassLoaderのparentが自動的にAppClassLoaderに設定され、カテゴリをロードするたびにparentに検索を依頼するので、前例でClassDemoTestカテゴリを検索するとBootstrap Loaderに先に検索を開始し、ExtClassLoader、AppClassLoaderに先に依頼します.見つからない場合は、新しいClassLoaderを使用して検索します.同じClassLoaderによってロードされたカテゴリ・ファイルは、1つのClassインスタンスしかありません.同じカテゴリ・ファイルが2つの異なるClassLoaderによってロードされている場合、2つの異なるClassインスタンスがあります.この説に注意してください.2つの異なるClassLoaderが同じカテゴリを検索し、parentのAppClassLoader検索パスで見つけられる場合、Classインスタンスは1つしかありません.それぞれのClassLoaderによって検索された場合、Classのインスタンスは2つあります.
// : , , webappclassloader
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{ //
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
// parent
c = parent.loadClass(name, false);
} else {
// Bootstrap
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
//parent Bootstrap ,
//
c = findClass(name);
}
}
protected Class<?> findClass(String name) throws ClassNotFoundException {
throw new ClassNotFoundException(name);//
}
ExtClassLoaderとAppClassLoaderはjavaです.net.URLClassLoaderのサブカテゴリです.java起動プログラムを使用する場合、ExtClassLoaderの検索パスを指定するには、次のコマンドを使用します.java-Djava.ext.dirs=c:/workspace/YourClass java起動プログラムを使用する場合、-classpathまたは-cpを使用してAppClassLoaderの検索パスを指定します.つまり、Classpath:java-classpath c:/workspace/YourClass ExtClassLoaderとAppClassLoaderはプログラム起動後にダミーマシンに存在します.プログラム実行中に検索パスを変更することはできません.プログラム実行中に他のパスからカテゴリを読み込むことを動的に決定するには、新しいカテゴリローダを生成します.URLClassLoaderを使用すると、javaが必要な新しいカテゴリ・ローダを生成できます.net.URLはそのパラメータとしてカテゴリロードの検索パスを指定します.例えば、URL url 1=new URL(「file:/d:/workspace/」);URLClassLoader urlClassLoader1 = new URLClassLoader(new URL[] {url1}); Class c1 = urlClassLoader1.loadClass("ClassDemoTest"); ClassLoaderを追加すると、そのloadClass()メソッドを使用してロードするカテゴリ名を指定できます.ClassLoaderを追加すると、追加したClassLoaderのparentが自動的にAppClassLoaderに設定され、カテゴリをロードするたびにparentに検索を依頼するので、前例でClassDemoTestカテゴリを検索するとBootstrap Loaderに先に検索を開始し、ExtClassLoader、AppClassLoaderに先に依頼します.見つからない場合は、新しいClassLoaderを使用して検索します.同じClassLoaderによってロードされたカテゴリ・ファイルは、1つのClassインスタンスしかありません.同じカテゴリ・ファイルが2つの異なるClassLoaderによってロードされている場合、2つの異なるClassインスタンスがあります.この説に注意してください.2つの異なるClassLoaderが同じカテゴリを検索し、parentのAppClassLoader検索パスで見つけられる場合、Classインスタンスは1つしかありません.それぞれのClassLoaderによって検索された場合、Classのインスタンスは2つあります.