美文网首页
java基础知识4-classload

java基础知识4-classload

作者: liwsh | 来源:发表于2021-03-18 19:12 被阅读0次

1.什么是classload

类加载器,用于将class文件加载到jvm虚拟机内

2.加载顺序

image.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来进行加载,当监控发现业务代码发生改变后,我们重新加载启动,老的业务代码的相关类则由虚拟机的垃圾回收机制来自动回收

相关文章

网友评论

      本文标题:java基础知识4-classload

      本文链接:https://www.haomeiwen.com/subject/jjhmqltx.html