作者meconin (miss you ~)
看板java
标题Re: [问题] ClassLoader
时间Fri Oct 15 21:54:53 2010
※ 引述《sbrhsieh (偶尔想摆烂一下)》之铭言:
: ※ 引述《meconin (miss you ~)》之铭言:
: : 我现在有两个 class 希望是用自己的 loader load 起来
: : clsA, clsB,
: : clsA{
: : test(){
: : System.out.println(
: : clsA.class.getClassLoader().getClass().getName());
: : }
: : }
: : clsB{
: : static test(){
: : clsA a = new clsA();
: : System.out.println(new a.test());
: : }
: : }
: : 我的 loader 暂时称呼为 ld
: : 我在 main 里面写
: : main{
: : Class a = ld.load("clsA", false);
: : Class b = ld.load("clsB", false);
: : b.test();
: : }
: : 会发现 clsA 的 loader 是 sun.misc.Launcher$AppClassLoader
: : 不知道有没有高手对这个机制比较了解,可以说明一下?
: 你的 class loader 最重要了,你反而没有给。
: 看起来你的 class loader 实做的 loadClass 是采一般的 delegation model,
: 而你在执行程式时所设定的 classpath 包含了 clsA 所在的路径,所以当程式
: 使用你设计的 class loader 企图载入 clsA 时,你的 class loader 会 delegate
: 给其 parent loader,而 parent loader(sun.misc.Launcher$AppClassLoader)
: 找的到 clsA 的 class file,於是就由 parent loader 载入 clsA。
感谢
抱歉,一下忘了给,想说反正就是 find class
protected Class<?> findClass (String name) throws ClassNotFoundException {
byte[] clsdef = null;
try {
clsdef = loadClassData (name);
} catch (Exception e) {
e.printStackTrace();
}
Class<?> cls;
cls =
defineClass (name,clsdef,0,clsdef.length,null);
resolveClass (cls);
return cls;
}
loadClassData 就是去特定路径把 clsA.class, clsB.class 读出来成 byte []
所以说 clsA.class, clsB.class 不能放在 classpath 下罗?
不然就会被 AppClassLoader 看到 ...
我是预期 ld.load 会比 AppClassLoader 早 load 到 clsA.class, clsB.class
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.46