ClassLoader,叫做类装载器。是用来把类装载进内存的,我们知道Android的类是保存到dex文件的,装载的大概过程就是读取这些dex文件,然后保存到内存的数据结构中去啦。Android大概可以分为系统和应用两个块,这个没毛病吧。那这两块的类装载器ClassLoader是长咋样的呢?
打印出系统与应用的类装载器,一目了然
系统的类装载器怎么获取呢?下面这样子就是了
systemClassLoader = ClassLoader.getSystemClassLoader();
应用的类装载器呢?
appClassLoader = this.getClassLoader();
好了,我们获取到类装载器了,要打印些啥?
1.首先我们循环打印父类ClassLoader。因为ClassLoader有一个很重要的特性,叫做双亲委托机制。就是装载类的时候,先让自己父亲去装载,防止重复装载。(他奶奶的,这个机制谁翻译的,明明就是单亲委托机制,委托他父亲嘛)。
2.打印ClassLoader的类查找路径。类装载就是根据这个路径,去查找类的。例如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) { //打印系统类装载器
Log.i(TAG, "systemClassLoader inherit :" + tempLoader.toString());
tempLoader = tempLoader.getParent();
}
}
}
打印结果如下:
看到上面结果了吧~
简单下个结论吧
应用ClassLoader
1.他的类装载器是一个PathClassLoader,类搜索路径是应用安装路径下的base.apk
2.他的父类装载器是BootClassLoader
系统ClassLoader
1.他的类装载器是一个PathClassLoader,类搜索路径是一个点".",我嚓,点是什么鬼。说明还是的靠他的父亲BootClassLoader去装载类罗。
2.他的父类装载器是BootClassLoader
BootClassLoader是ClassLoader链条中最老的一环,就是大爷级人物。