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}}