makefile
C/C++ 的makefile 處理的是編譯凭涂,鏈接的過程祝辣,手下是將源文件編譯成中間文件 .o文件,然后將 .o 文件進(jìn)行合并(鏈接)切油,生成可執(zhí)行的文件
Java類的加載
一個(gè)Java類從字節(jié)代碼到能夠在JVM中被使用蝙斜,需要經(jīng)過加載、鏈接和初始化這三個(gè)步驟
通過使用Java類加載器(class loader)可以在運(yùn)行時(shí)刻動(dòng)態(tài)的加載一個(gè)Java類澎胡;而鏈接和初始化則是在使用Java類之前會(huì)發(fā)生的動(dòng)作
Java類的加載是由類加載器來完成的孕荠。一般來說,類加載器分成兩類:啟動(dòng)類加載器(bootstrap)和用戶自定義的類加載器(user-defined)攻谁。兩者的區(qū)別在于啟動(dòng)類加載器是由JVM的原生代碼實(shí)現(xiàn)的稚伍,而用戶自定義的類加載器都繼承自Java中的java.lang.ClassLoader類。在用戶自定義類加載器的部分巢株,一般JVM都會(huì)提供一些基本實(shí)現(xiàn)槐瑞。應(yīng)用程序的開發(fā)人員也可以根據(jù)需要編寫自己的類加載器。JVM中最常使用的是系統(tǒng)類加載器(system)阁苞,它用來啟動(dòng)Java應(yīng)用程序的加載困檩。通過java.lang.ClassLoader的getSystemClassLoader()方法可以獲取到該類加載器對(duì)象祠挫。
類加載器的一個(gè)重要用途是在JVM中為相同名稱的Java類創(chuàng)建隔離空間。在JVM中悼沿,判斷兩個(gè)類是否相同等舔,不僅是根據(jù)該類的二進(jìn)制名稱,還需要根據(jù)兩個(gè)類的定義類加載器糟趾。只有兩者完全一樣慌植,才認(rèn)為兩個(gè)類的是相同的。因此义郑,即便是同樣的Java字節(jié)代碼蝶柿,被兩個(gè)不同的類加載器定義之后,所得到的Java類也是不同的
Android 類加載
一個(gè)是BootClassLoader(系統(tǒng)啟動(dòng)的時(shí)候創(chuàng)建的)非驮,另一個(gè)是PathClassLoader(應(yīng)用啟動(dòng)時(shí)創(chuàng)建的交汤,用于加載“/data/app/me.kaede.anroidclassloadersample-1/base.apk”里面的類)。由此也可以看出劫笙,一個(gè)運(yùn)行的Android應(yīng)用至少有2個(gè)ClassLoader芙扎。
DexClassLoader 和 PathClassLoader
在Android中,ClassLoader是一個(gè)抽象類填大,實(shí)際開發(fā)過程中戒洼,我們一般是使用其具體的子類DexClassLoader、PathClassLoader這些類加載器來加載類的允华,它們的不同之處是:
DexClassLoader可以加載jar/apk/dex圈浇,可以從SD卡中加載未安裝的apk;
PathClassLoader只能加載系統(tǒng)中已經(jīng)安裝過的apk例获;