ClassLoader學習記錄2

2021-09-01 04:11:28 字數 1415 閱讀 3710

寫程式的時候,時常會思考,我們的類是哪來的?為何我們想用sdk中的類,就有這個類呢?答案肯定是classloader讀進虛擬機器來的。那他究竟是怎麼被載入到虛擬機器中的呢?看看如何定製classloader的**,就相當一目了然了。

main() 

public void runclass(string name, int key));

}class cryptoclassloader extends classloader

protected class<?> findclass(string name) throws classnotfoundexception catch(ioexception e)

class<?> cl = defineclass(name, classbytes, 0, classbytes.length);

if (cl == null) throw new classnotfoundexception(name);

return cl;

}private byte loadclassbytes(string name) throws ioexception

return b.tobytearray();

} finally }}

此段**看完發現(defineclass方法),虛擬機器載入新類的方式就是:使用父類的[color=red]defineclass[/color]方法將某class類的位元組碼傳遞給虛擬機器,(其實就是以位元組形式把位元組碼傳遞給虛擬機器),並且建立相應的類。

下來解釋一下上面的程式:key這個int。這個例子使用了乙個小的加密方法,就是類檔案中所有的位元組都向後移動了key個位置,比如3,那麼,在載入此類時,就應該向前移動3,來保證檔案被解密。這裡我們就引申出了自定義classloader的[color=red]用法之一[/color],即[color=red]加密[/color]。你想使用這個類?請知道金鑰先!就好像遊戲的註冊碼一樣,沒有key和我們的classloader,你拿到類檔案也是沒有任何意義的。(好吧我承認程式裡的加密方法不怎麼先進)

怎麼樣,很棒吧。其實一直以來,還有個疑問,如果包名和類名一樣的情況,classloader應該如何處理?首先,像上面的情況,乙個路徑下是不能放相同名字的類檔案的,先排除此情況。那如果在多jar包的環境下,真的有兩個一樣的類名呢?我想、估計是直接使用第乙個被load進的類吧,因為classloader會判斷此類已經被載入進來了,畢竟classloader也不會讀心數,知道你想使用哪個jar包的類。

還有個比喻,我想到的,可能會比較爛。比如,android上的兩個不同的apk,如果兩個程式中,使用相同的包名和類名的話,應該也不會相互干擾,因為不同的classloader導致。(因為每個程序都有自己的虛擬機器,那麼classloader也理應不同,恩,應該是這樣,本身classloader就是給虛擬機器服務的嘛。)

ClassLoader學習筆記

bootstrap classloader 啟動類載入器 負責jdk的核心類庫 extension classloader 擴充套件類載入器 負責載入jdk擴充套件類庫 使用雙親委託模型可以避免類被重複載入。jvm在判定兩個類是否相同時,不僅判斷是否類名相同,還要判斷是否由同乙個類載入器載入的。自定...

classloader機制初探

size medium b classloader學習心得 b size size medium 1.例項化指令才會使類裝載器裝載類。單獨宣告並不會裝載。size a a new a load class a b b class b won t be loaded size medium 2.類的靜...

ClassLoader學習和類載入器載入Jar檔案

類載入器,參考 本文主要的實現的功能是把乙個jar檔案載入到classloader中 原理 把jar檔案載入成url,通過構造乙個urlclassloader,把原來的classloader和jar檔案合併 準備檔案 helloword.jar 其中內容為 package master.classl...