別のクラスローダーだと同じクラスでもキャストできない場合の対処法。
別のクラスローダーから読み込んだクラスがキャストできない件の対処法は
調べた結果、インターフェース使うしかないっぽい。で、ためしにテストコード作ってみた。
これで途中でTest.java書き換えてもなんとか動かすことが可能。
うまく設計しなきゃいけないけども、こういうやり方だったらJVM動かしたまま
クラスの書き換えが可能だから、システム停止しなくてバージョンアップができるかも。あくまでもインターフェースの仕様の範囲内でそれ以上のことはさらに工夫しなくちゃできないだろうけども・・・
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; /** * * @author kensir0u * */ public class Loader extends ClassLoader{ public static void main (String args[]) throws Exception{ Loader l = new Loader(); ITest it; Class c = l.loadClass("Test", true); Object o = c.newInstance(); if (o instanceof ITest) { it = (ITest)o; it.p(); } BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.print("pause & edit Test.java>"); reader.readLine(); Loader l2 = new Loader(); Class c2 = l2.loadClass("Test", true); Object o2 = c2.newInstance(); if (o2 instanceof ITest) { it = (ITest)o2; it.p(); } } private byte[] loadByte(String name) throws Exception { final File f = new File(System.getProperty("user.home") + "\\workspace\\classload\\bin\\Test.class"); byte[] b = null; final long lb = f.length(); b = new byte[(int)lb]; final FileInputStream fi = new FileInputStream(f); fi.read(b); fi.close(); return b; } public synchronized Class loadClass(String name,boolean resolve) throws ClassNotFoundException { Class c = null; try { byte[] b = null; if ("Test".equals(name)) { b= loadByte(name); } else { b= null; } if (b != null) { c = defineClass(name,b,0,b.length); if (c !=null) resolveClass(c); } else { c = findSystemClass(name); } } catch(Exception e){} return c; } } /** * * @author kensir0u * */ public class Test implements ITest{ public void p(){ System.out.println("TEST!"); } } /** * * @author kensir0u * */ public interface ITest { void p(); }