ClassLoader,叫做類裝載器家肯。是用來把類裝載進內(nèi)存的盟猖,我們知道Android的類是保存到dex文件的,裝載的大概過程就是讀取這些dex文件反镇,然后保存到內(nèi)存的數(shù)據(jù)結(jié)構中去啦娘汞。Android大概可以分為系統(tǒng)和應用兩個塊,這個沒毛病吧。那這兩塊的類裝載器ClassLoader是長咋樣的呢燎孟?
打印出系統(tǒng)與應用的類裝載器尸昧,一目了然
系統(tǒng)的類裝載器怎么獲取呢?下面這樣子就是了
systemClassLoader = ClassLoader.getSystemClassLoader();
應用的類裝載器呢彻磁?
appClassLoader = this.getClassLoader();
好了,我們獲取到類裝載器了累提,要打印些啥磁浇?
1.首先我們循環(huán)打印父類ClassLoader。因為ClassLoader有一個很重要的特性置吓,叫做雙親委托機制。就是裝載類的時候友题,先讓自己父親去裝載戴质,防止重復裝載。(他奶奶的告匠,這個機制誰翻譯的,明明就是單親委托機制划鸽,委托他父親嘛)戚哎。
2.打印ClassLoader的類查找路徑。類裝載就是根據(jù)這個路徑建瘫,去查找類的尸折。例如ClassLoader A的查找路徑是/sdcard/hehe,他就會去hehe去找類了,O(∩_∩)O哈哈哈~
好了橄浓,我們來歡快地打印吧~
public class InheritDemo extends AppCompatActivity {
public static final String TAG = "InheritDemoWf";
ClassLoader appClassLoader;
ClassLoader systemClassLoader;
ClassLoader tempLoader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_inherit_demo);
appClassLoader = this.getClassLoader();
tempLoader = appClassLoader;
while (tempLoader != null) { //打印應用類裝載器
Log.i(TAG, "appclassloader inherit :" + tempLoader.toString());
tempLoader = tempLoader.getParent();
}
systemClassLoader = ClassLoader.getSystemClassLoader();
tempLoader = systemClassLoader;
while (tempLoader != null) { //打印系統(tǒng)類裝載器
Log.i(TAG, "systemClassLoader inherit :" + tempLoader.toString());
tempLoader = tempLoader.getParent();
}
}
}
打印結(jié)果如下:
看到上面結(jié)果了吧~
簡單下個結(jié)論吧
應用ClassLoader
1.他的類裝載器是一個PathClassLoader荸实,類搜索路徑是應用安裝路徑下的base.apk
2.他的父類裝載器是BootClassLoader
系統(tǒng)ClassLoader
1.他的類裝載器是一個PathClassLoader,類搜索路徑是一個點"."准给,我嚓,點是什么鬼祖灰。說明還是的靠他的父親BootClassLoader去裝載類羅畔规。
2.他的父類裝載器是BootClassLoader
BootClassLoader是ClassLoader鏈條中最老的一環(huán),就是大爺級人物叁扫。