作者wctang (wctang)
看板java
标题Re: [J2SE] class loader
时间Tue Jun 17 10:07:04 2008
※ 引述《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
1F:推 csihcs:谢谢大大的说明,来研究看看,感恩!!! 06/17 10:08
2F:推 csihcs:太谢谢大大了~~~终於成功了^_^ m(_@_)m 06/17 10:51
3F:推 csihcs:另外想问 clsldr = new URLClassLoader(new URL[] { url } 06/17 10:58
4F:推 csihcs:是指若与 default ClassLoader 相同位置时,等同无效果?? 06/17 11:00
5F:→ csihcs:会有这个想法是因为 url 是 "file:./" 的时候就不会update 06/17 11:02