トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

Javaで、実行中にクラスを再読み込みする

http://mt.orz.at/archives/2009/12/classloader.html

クラスローダーにはBootstrapクラスローダーやシステムクラスローダー、コンテキストクラスローダーがあります。(あと拡張クラスローダーですかね)。そんでもって、クラスローダーは親子関係を持っています。委譲モデルと言って、あるクラスローダーにクラスをロードする依頼があると、親に依頼を委譲します。最初に発見されたクラスが実際にロードされるわけです。
1. Bootstrap (rt.jar)
2. 親クラスローダーA
3. 子クラスローダーB
こんなクラスローダーがあるとしてまだロードされていないクラスXをロードしようとした場合は次のように動作します。

  1. B.loadClass(X)
  2. Aに委譲
  3. Bootstrapに委譲
  4. BoostrapにXは存在しない
  5. AにXは存在しない
  6. BにXが存在するのでロードする。

これを利用して、

I.java

1
2
3
public interface I {
  public void test();
}

class1/A.java(コンパイル時には、 I にクラスパスを通す)

1
2
3
4
5
6
public class A implements  I {
  
  public void test(){
    System.out.println("test1");
  }
}

class2/A.java(コンパイル時には、 I にクラスパスを通す)

1
2
3
4
5
public class A implements I {
  public void test(){
    System.out.println("test2");
  }
}

test.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2011年10月19日 22時58分24秒