Java 类加载器-简单
Now我们来简单了解一下Java的类加载器。
类加载器 简述
大家都知道,完整的Java程序由n个.class文件组成。Java程序运行时,类加载器并不会加载全部class文件,而是“按需加载”。一开始,类加载器会先加载入口函数“main”所在的class,并运行“main”方法。在“main”方法中,我们调用了哪个类(如 new Student),就将哪个类的class(Student.class)文件加载到内存中。所以说类加载器是用于“动态”加载class文件的。
加载类机制 双亲机制
在加载Java类时,会使用很多类型的加载器,如Bootstrap ClassLoader,Extension ClassLoader,App ClassLoader等。除了Bootstrap ClassLoader(这是最顶层的类加载器),每个类加载器都有一个父加载器(非继承),当某个ClassLoader(ClassLoader A)实例想要加载一个类时,并不会直接加载,而是先委托父加载器App ClassLoader去加载,如果App ClassLoader还有父加载器,继续向上委托,一直到Bootstrap ClassLoader。所以Bootstrap ClassLoader是最先尝试加载某个类,如果Bootstrap ClassLoader没有找到想要加载的class,交给下一个Extension ClassLoader加载去加载。如果Extension ClassLoader还是没有找到,交给App ClassLoader去加载,如果还是没有找到,交给具体ClassLoader(ClassLoader A)去加载,如果还是没有找到,则抛出ClassNotFoundException 异常。
双亲机制的好处
使用双亲机制来加载类,可以避免重载加载,如果父加载器已经加载目标类了,那么子类没必要再加载一次相同的类。为什么要避免重复加载类呢?如果可以重复加载,我们可以重新定义java核心api中定义的类型,如String类,然后我们来动态代替这些类,这样会破坏系统,带来非常大的安全隐患。使用双亲机制就可以避免加载我们自定义的String类了。
Android类加载器
对于 Android 而言,最终的 apk 文件包含的是 dex 类型的文件,dex文件是将 class 文件重新打包,打包的规则又不是简单地压缩,而是完全对class 文件内部的各种函数表,变量表进行优化,产生一个新的文件,即dex文件。因此加载这种特殊的 Class 文件就需要特殊的类加载器DexClassLoader。