Android中的class loader如上圖,class loader使用雙親委托模型,簡單說就是當(dāng)一個(gè)classloader開始加載類的時(shí)候,它總是讓它的parent去嘗試加載,如果失敗,那么再嘗試自己加載,這個(gè)設(shè)計(jì)的好處是帶來安全性,避免了偽造類
DexClassLoader可以指定自己的optimizedDirectory,所以它可以加載外部的dex,因?yàn)檫@個(gè)dex會被復(fù)制到內(nèi)部路徑的optimizedDirectory;而PathClassLoader沒有optimizedDirectory,所以它只能加載內(nèi)部的dex,這些大都是存在系統(tǒng)中已經(jīng)安裝過的apk里面的。
通過XXX.getClassLoader()可以知道這個(gè)class是由哪個(gè)classloader加載的
一個(gè)運(yùn)行的Android應(yīng)用至少有2個(gè)ClassLoader,BootClassLoader(系統(tǒng)啟動(dòng)的時(shí)候創(chuàng)建的)以及PathClassLoader(應(yīng)用啟動(dòng)時(shí)創(chuàng)建的)
同一個(gè)Class = 相同的 ClassName + PackageName + ClassLoader,如果同一個(gè)類被不同classloader重復(fù)加載了會拋出異常