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
1 |
public interface I { public void test(); } |
class1/A.java(コンパイル時には、 I にクラスパスを通す)
1 |
public class A implements I { public void test(){ System.out.println("test1"); } } |
class2/A.java(コンパイル時には、 I にクラスパスを通す)
1 |
public class A implements I { public void test(){ System.out.println("test2"); } } |
test.java
1 |
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); } } } |
[カテゴリ: プログラミング言語 > Java]
[通知用URL]
Tweet
最終更新時間:2011年10月19日 22時58分24秒