jvm加载字节码的第一步有个加载,加载首先就是根据类的全限定名找到类的二进制字节流。jvm将这一步暴漏了出来,我们可以通过实现自己的类加载器完成这一步。这样我们就可以动态的指定我们类所在的位置,网络,磁盘等等,或者动态生成也可以。
通过这个特性,我们就有了实现热部署,代码加密等的思路。
分类
- boot加载 ,javahome中的jar
- extent加载 ,javahome中ext下的jar文件
- app加载,程序运行的class文件
- 自定义加载,自己指定
双亲委派(保证了核心类只加载一次)
- 双亲委派并不是继承,而是组合的方法
- 逻辑:
- 先检查是否加载过(native)
- 没有加载过的话,如果parent不空,让parent加载。如果parent空,让boot加载。
- 之后class还是为空,调用自己的findClass方法加载。
- 代码如下:
1 | protected Class<?> loadClass(String name, boolean resolve) |
- 我们知道了双亲委派的机制是在classLoader的loadClass方法中实现的,所以我们在实现自定义classlaoder的时候原则上不建议重写loadclass,而是重写findclass方法
Thinker大致原理
android虚拟机不是加载class文件的,而是dex文件。使用的是dexClassLoader,dexClassLoader中有一个List存放dex文件的路径,加载的时候会安顺序去加载,我们可以通过反射将修复好的dex文件放入list的首部,这样修复好的类会先被找到,那么运行的时候跑的就是修复好的类文件。