Re: [問題] ClassLoader
※ 引述《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
討論串 (同標題文章)