http://mt.orz.at/archives/2009/12/classloader.html
クラスローダーにはBootstrapクラスローダーやシステムクラスローダー、コンテキストクラスローダーがあります。(あと拡張クラスローダーですかね)。そんでもって、クラスローダーは親子関係を持っています。委譲モデルと言って、あるクラスローダーにクラスをロードする依頼があると、親に依頼を委譲します。最初に発見されたクラスが実際にロードされるわけです。
1. Bootstrap (rt.jar)
2. 親クラスローダーA
3. 子クラスローダーB
こんなクラスローダーがあるとしてまだロードされていないクラスXをロードしようとした場合は次のように動作します。
+B.loadClass(X)
+Aに委譲
+Bootstrapに委譲
+BoostrapにXは存在しない
+AにXは存在しない
+BにXが存在するのでロードする。
これを利用して、
I.java
{{code Java,
public interface I {
public void test();
}
}}
class1/A.java(コンパイル時には、 I にクラスパスを通す)
{{code Java,
public class A implements I {
public void test(){
System.out.println("test1");
}
}
}}
class2/A.java(コンパイル時には、 I にクラスパスを通す)
{{code Java,
public class A implements I {
public void test(){
System.out.println("test2");
}
}
}}
test.java
{{code Java,
import java.io.*;
import java.net.*;
public class test {
public static void main(String[] args){
try {
URLClassLoader cl = new URLClassLoader(new URL[]{new File("class1").toURI().toURL()});
((I)cl.loadClass("A").newInstance()).test();
cl = new URLClassLoader(new URL[]{new File("class2").toURI().toURL()});
((I)cl.loadClass("A").newInstance()).test();
// ((URLClassLoader)ClassLoader.getSystemClassLoader()).addURL(new File("class1").toURI().toURL());
} catch (Exception e){
System.out.println(e);
}
}
}
}}
{{category2 プログラミング言語,Java}}