15|类加载机制的改变:如何自定义ClassLoader?
类加载器原理
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了如何在MiniTomcat框架中引入自定义加载器,重点讲解了定义Loader通用接口和调整Container通用接口的过程。作者首先介绍了MiniTomcat框架中的两类ClassLoader,并着重介绍了自定义的WebappClassLoader。随后,详细讲解了定义Loader通用接口的具体步骤,并展示了对Container通用接口的调整。文章还提到了需要对ContainerBase中的getLoader和setLoader方法进行调整,以及涉及到其他类的修改。通过本文,读者可以了解到如何在MiniTomcat框架中引入自定义加载器,并对相关接口和类进行调整,以满足特定需求。文章还对Tomcat的类加载过程进行了详细说明,包括CommonClassLoader和WebappClassLoader的代码定义和加载类的过程。这篇文章对于想要深入了解类加载机制和自定义ClassLoader的读者来说是一份有价值的技术指南。文章还介绍了如何调整服务器代码以及对MiniTomcat进行测试,最后总结了本节课的内容并提出了思考题,引发读者思考。
《手把手带你写一个 MiniTomcat》,新⼈⾸单¥59
全部留言(5)
- 最新
- 精选
- Geek_50a5cc双亲委托 是 将类的加载放到上一层处理,如果加载到,就不需要重复加载;所以遇到一个User类,不管是版本1,2,都会加载,不会再去处理其他的User类
作者回复: 是的是的
2024-01-22归属地:北京1 - peter请教老师几个问题: Q1:CommonLoader与CommonClassLoader是什么关系? CommonClassLoader并没有继承CommonLoader。 Q2:Tomcat只有Common加载器吗? MiniTomcat用Common加载器来加载服务器通用的类,用WebappClassLoader来加载应用的类。但是,文章中讲到的Tomcat的类加载图中,只有Common,并没有WebappClassLoader。 Q3:System是扩展类加载器吗? 文中几个关于类加载的图中,都有“System”这个措辞,它是指扩展类加载器吗? Q4:类的版本怎么体现? 一个类有多个版本,怎么体现?通过类名字来体现? Q5:类被加载以后是放在方法区吗? 比如,类Person,被加载以后会创建一个针对Person的对象,假设名字是A。那么,加载以后得类Person和A是被放在内存中的方法区吗?
作者回复: Q1,loader是Tomcat自己的包装,classloader是Java的。MiniTomcat同样这么做的。 Q2,common用于Tomcat的lib目录下的包,webappclassloader用于webapps目录下的应用 Q3,system是指Java提供的加载器,包括app, ext和根 Q4,一个类,修改一下,重新编译,就是一个新的版本了 Q5,类本身的信息放在方法区的(现在叫Meta区)。这些也依赖于JVM本身的实现。
2024-01-11归属地:北京1 - HH🐷🐠JVM 里一个类的唯一标识是 ClassLoader + 类名, 按照双亲委派模式都是由相同的 ClassLoader 去加载, 无疑会冲突。 老师, 还有一个问题, CommonClassLoader 是不是要指定一下 delegate,默认为 false
作者回复: 可以指定delegate,没问题。不过我没注意查Tomcat这一部分源代码是怎么处理的。
2024-01-14归属地:广东 - InfoQ_1f089af08bc8老师能否讲解一下类加载器的findClass(String name)和loadClass(String name)之间有什么关联吗?
作者回复: load是规定一个步骤策略,比如说第一步用system去找,第二步用ext加载器去找,规定了一个步骤。 find是根据位置按照字节码规范去加载这个类,然后用defineClass就把字节流变成了一个类。
2024-01-10归属地:北京 - InfoQ_1f089af08bc8请问老师,URLStreamHandler 这个类的作用是干什么的?
作者回复: 一个资源的定位用url表示,如何打开这个资源呢?通过某种协议,如http, https,或者file,这个handler就是来处理协议的。
2024-01-10归属地:北京