看板 java 關於我們 聯絡資訊
※ 引述《wctang (wctang)》之銘言: : 其實,我的確一直是用 jar 來做的。但我不認為只能用 jar : 根據 http://java.sun.com/j2se/1.4.2/docs/api/java/net/URLClassLoader.html : "Any URL that ends with a '/' is assumed to refer to a directory." : 這可能是理由。 推 csihcs:剛剛試過用 new URL("file:/"); 了 06/17 03:05 → csihcs:output 還是 bfe bfe Q.Q" 06/17 03:06 public class Main { static void writefile(String folder, String name, String content) throws Exception { new File(folder).delete(); new File(folder).mkdir(); FileWriter fo = new FileWriter(folder+"/"+name+".java"); fo.write(content); fo.close(); Runtime.getRuntime().exec("javac -cp . " + folder+"/"+name+".java").waitFor(); new File(folder+"/"+name+".java").delete(); } public static void main(String[] args) throws Exception { writefile("tmp", "B", "public class B implements A{public void s(){System.out.println(\"bfr\");}}"); URL url = new URL("file:./tmp/"); ClassLoader clsldr = new URLClassLoader(new URL[] { url }, Main.class.getClassLoader()); A cls = (A) clsldr.loadClass("B").newInstance(); cls.s(); writefile("tmp", "B", "public class B implements A{public void s(){System.out.println(\"aft\");}}"); clsldr = new URLClassLoader(new URL[] { url }, Main.class.getClassLoader()); cls = (A) clsldr.loadClass("B").newInstance(); cls.s(); } } 上面的程式簡單說就是把 .class 寫到某個目錄中,再指定 classloader 去指定的 目錄中讀就可以了。 至於為什麼需要這一層動作,希望你能看看相關資料了解這裡 classloader 的作用, 應該可以找出根本的原因來。關鍵是 classloader 的階層架構,和 loader class 的尋 找順序,更深入的話可以了解到 classloader 和安全性的關係。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.125.148.101
csihcs:謝謝大大的說明,來研究看看,感恩!!! 06/17 10:08
csihcs:太謝謝大大了~~~終於成功了^_^ m(_@_)m 06/17 10:51
csihcs:另外想問 clsldr = new URLClassLoader(new URL[] { url } 06/17 10:58
csihcs:是指若與 default ClassLoader 相同位置時,等同無效果?? 06/17 11:00
csihcs:會有這個想法是因為 url 是 "file:./" 的時候就不會update 06/17 11:02