最近看到了这个ClassLoader(类加载器),平时开发Android的时候很少注意这块,今天学习了一下,顺便总结一下。
我们平时写的Java代码,通过编译器会转成java字节代码保存在.class文件中。然后ClassLoader去加载class文件到JVM(java虚拟机)去执行。
JVM提供了三层ClassLoader,包含
Bootstrap classLoader C++实现,主要负责加载核心的类库,包含构造下面两个
ExtClassLoader 扩展加载类,负责加载jre/lib/ext的一些扩展jar
AppClassLoader 系统加载类,这个主要就是用来加载我们平时写的java代码
类加载器是通过类名实现加载,由于不同的加载器加载相同的类名,得到的class实例其实是不一样的,是两个不同的类,我们通过class.newInstance来实例,这就导致如果使用加载器,运行中可能出现风险和报错。
然后双亲委派机制就是解决这个问题。大概流程是这样
1.类加载器首先会层层调用AppClassLoader-> ExtClassLoader-> BootstrapLoader,会通过这样,先一层一层往下询问,是否可以加载,如果都不行,在反向回来BootstrapLoader-> ExtClassLoader-> AppClassLoader,最后报错classnotfound。
2.中间过程中类加载过会有缓存,只加载一次
3.这样的方式正常最终都是使用BootstrapLoader去加载类,实现java中的基类,想Integer,Boolean这些,即使重写类,都没生效的缘故,使得都是同个加载器加载出来,都是同个类,来保证安全性
网友评论