Re: [J2SE] class loader

看板java作者 (wctang)時間17年前 (2008/06/17 10:07), 編輯推噓4(401)
留言5則, 1人參與, 最新討論串7/7 (看更多)
※ 引述《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

06/17 10:08, , 1F
謝謝大大的說明,來研究看看,感恩!!!
06/17 10:08, 1F

06/17 10:51, , 2F
太謝謝大大了~~~終於成功了^_^ m(_@_)m
06/17 10:51, 2F

06/17 10:58, , 3F
另外想問 clsldr = new URLClassLoader(new URL[] { url }
06/17 10:58, 3F

06/17 11:00, , 4F
是指若與 default ClassLoader 相同位置時,等同無效果??
06/17 11:00, 4F

06/17 11:02, , 5F
會有這個想法是因為 url 是 "file:./" 的時候就不會update
06/17 11:02, 5F
文章代碼(AID): #18Lnn9kS (java)
文章代碼(AID): #18Lnn9kS (java)