Tomcat拾遗--BootStrap类的静态代码块和反射调用C
2019-01-21 本文已影响27人
简书徐小耳
首先我们需要知道一个潜规则:即如果我们在A类中调用B类,如果B类没有被classloader加载或者就算加载了 但是该classloader和A类的classloader属于平行的,即我们在A的classloader中找不到B类的class,那么A会使用自己的classloader去加载B。
BootStrap类的静态代码块的意义
默认设置好catalina.base和catalina.home 这样commonClassloader 就可以被初始化好。
反射调用Catalina的意义
至于 为啥要使用反射调用catalina,那是因为 我们通过catalinaLoader生成Catalina类,那么接下来的tomcat使用到的类 默认都会使用catalinaLoader加载,而对于我们webapp下面的则使用我们的shareLoader去加载。 这样的好处就是如果我们在我们项目中使用到了tomcat在catalina中使用到的类,那么因为classloader不一样 所以做到类的隔离,否组会存在版本冲突 .
补充:这边catalina最终还是有appclassloader加载,那么我们在catalina里面用到的类如果只想给tomcat自己使用,我们会去使用使用线程上下文去加载,因为catalina的classloader无法去加载子类的catalinaLoader的class,所以只能使用线程上下文的类加载器