一、类加载器简介
1.什么是类加载器
把.class文件加载到JVM的方法区中,变成一个Class对象
2.如何得到类加载器
Class#getClassLoader()
3.类加载器的分类
它们都是片警
引导:类库
扩展:扩展jar包
系统:应用下的class,包含开发人员写的类,和第三方的jar包,classpath下的类
系统类加载器的上层领导:扩展
扩展类加载器的上层领导:引导
引导没上层
二、类加载器的委托机制
1.委托过程
代码中出现了这么一行:new A()
系统发现了自己加载的类,其中包含了new A(),这说明需要系统去加载A类
系统会让自己的领导去找,即让扩展去自己的地盘去加载A类
扩展会让自己的领导去找,即让引导去自己的地盘去加载A类
引导自己真的去rt.jar中寻找A类
如果找到了,那么类加载器加载之,然后返回A对应的Class对象给扩展,扩展也会把这个Class返回给系统!
如果没找到
引导给扩展返回了一个null,拓展会自己去自己的地盘寻找A类
如果找到了,那么类加载器加载之,然后返回A对应的Class对象给系统!
如果没找到
扩展返回一个null给系统,系统去自己的地盘(应用程序下)加载A类
如果找到了,那么类加载器加载之,然后返回这个Class!
如果没找到,抛出异常ClassNotFoundException
2.类的解析过程
class MyApp{ //被系统加载
main(){
A a=new A(); //也由系统加载
String s=new String(); //也由系统加载
}
}
class String{ //引导
private Integer i; //直接引导加载
}
三、Tomcat的类加载器
1.Tomcat提供的类加载器
Tomcat提供了两种类加载器:
服务器类加载器:
${CATALINA_HOME}\lib,服务器类加载器,它负责加载这个下面的类
应用类加载器:
${CONTEXT_HOME}\WEB-INF\lib,${CONTEXT_HOME}\WEB-INF\classes,应用类加载器,它负责加载这两个路径下的类
2.Tomcat类解析顺序
引导
扩展
系统
服务器类加载器
应用类加载器
其中特性:
服务器类加载器:先自己动手,然后再去委托
应用类加载器:先自己动手,然后再去委托
来源:传智播客(崔希芳老师)
优先级:
应用下的classes:应用类加载器
应用下的lib:应用类加载器
服务器下的lib:服务器类加载