1.什么是classload
类加载器,用于将class文件加载到jvm虚拟机内
2.加载顺序
![](https://img.haomeiwen.com/i6504578/fb767f8653c47ec5.png)
3编写自定义类加载器
1.编写一个类继承自classloader
2.复写findclass方法
3.findclas中调用defineclass
4.为什么要用双亲委派模型
因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。考虑到安全因素,我们试想一下,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义的类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况
5.VM在搜索类的时候,又是如何判定两个class是相同
JVM在判定两个class是否相同时,不仅要判断两个类名是否相同,而且要判断是否由同一个类加载器实例加载的。只有两者同时满足的情况下,JVM才认为这两个class是相同的
6. 自定义classLoad场景
1.Tomcat容器,每个WebApp有自己的ClassLoader,加载每个WebApp的ClassPath路径上的类,一旦遇到Tomcat自带的Jar包就委托给CommonClassLoader加载
2.对于公司的一些核心类库,可能会把字节码加密,这样加载类的时候就必须对字节码进行解密,可以通过findClass读取URL中的字节码,然后加密,最后把字节数组交给defineClass()加载
3.通常一个项目的代码由以上四部分组成,即基础类、扩展类、二方包/三方包、以及我们自己编写的业务代码组成。上面的一排是我们通常的类加载结构,其中业务代码和二方包/三方包是由应用加载器加载的。而实际开发和调试的过程中,主要变化的是业务代码,并且业务代码相对二方包/三方包的内容来说会更少一些。因此我们可以将业务代码单独通过一个自定义的加载器Custom Classloader来进行加载,当监控发现业务代码发生改变后,我们重新加载启动,老的业务代码的相关类则由虚拟机的垃圾回收机制来自动回收
网友评论