クラスローダメモその3

Java では同じ名前のクラスでも,同じ .class ファイルから
ロードされたクラスでも,異なったクラスローダーから
ロードしたクラスは別のクラスとして扱われます.

http://ml.seasar.org/archives/seasar-user/2007-January/007808.html

クラスローダのディープな世界へようこそ.

まず,Java ではクラスは VM 上に一つではなく,
同じクラスでもクラスローダごとに複数存在する
場合があります.
そして異なったクラスローダでロードされたクラスは,
たとえ同じ .class ファイルからロードされたもので
あっても異なったクラスとして扱われます.

例えば Foo というクラスがクラスローダ A と B に
ロードされた場合,Foo(A) と Foo(B) は異なった
クラスであり,そのインスタンスも別物です.
Foo(A) 型の変数に Foo(B) のインスタンスを代入
することもできません.

http://ml.seasar.org/archives/seasar-user/2008-March/013148.html

の状況を再現すると、DirectoryClassLoaderのコンストラクタでsuper(null)にして下記を実行すると、
ClassCastExceptionが発生することで確認できる。

public class Test2 {
	public static void main(String[] args) {
		ClassLoader loader3 = new DirectoryClassLoader(
		"C:\\eclipse_workspace\\seasar2\\classloader\\bin");
		try {
			Hello hello = (Hello)Class.forName("Hello", true, loader3).newInstance();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}