Re: [J2SE] class loader
※ 引述《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
06/17 10:51, 2F
推
06/17 10:58, , 3F
06/17 10:58, 3F
推
06/17 11:00, , 4F
06/17 11:00, 4F
→
06/17 11:02, , 5F
06/17 11:02, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 7 之 7 篇):