クラスローダメモその3
Java では同じ名前のクラスでも,同じ .class ファイルから
http://ml.seasar.org/archives/seasar-user/2007-January/007808.html
ロードされたクラスでも,異なったクラスローダーから
ロードしたクラスは別のクラスとして扱われます.
クラスローダのディープな世界へようこそ.
まず,Java ではクラスは VM 上に一つではなく,
同じクラスでもクラスローダごとに複数存在する
場合があります.
そして異なったクラスローダでロードされたクラスは,
たとえ同じ .class ファイルからロードされたもので
あっても異なったクラスとして扱われます.例えば Foo というクラスがクラスローダ A と B に
http://ml.seasar.org/archives/seasar-user/2008-March/013148.html
ロードされた場合,Foo(A) と Foo(B) は異なった
クラスであり,そのインスタンスも別物です.
Foo(A) 型の変数に Foo(B) のインスタンスを代入
することもできません.
の状況を再現すると、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(); } } }