1. 什么是类加载器
- 把.class文件加载到JVM的方法区中,变成一个Class对象!
2. 得到类加载器
- Class#getClassLoader()
3. 类加载器的分类
它们都是片警!
- 引导:类库!(是jvm虚拟机的一部分,由C语言实现,所以虽然他也是类,但是不需要加载)
Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类 - 扩展:扩展jar包
加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库 - 系统:应用下的class,包含开发人员写的类,和第三方的jar包!classpath下的类!
系统类加载器的上层领导:扩展
扩展类加载器的上层领导:引导
引导没上层,它是BOSS
======================================
4. 类加载器的委托机制(从领导加载类,是为了安全,防止应用下的类覆盖了类库里面的类)
- 代码中出现了这么一行:new A();
系统发现了自己加载的类,其中包含了new A(),这说明需要系统去加载A类
系统会给自己的领导打电话:让扩展去自己的地盘去加载A类
扩展会给自己的领导打电话:让引导去自己的地盘去加载A类
引导自己真的去rt.jar中寻找A类- 如果找到了,那么加载之,然后返回A对应的Class对象给扩展,扩展也会它这个Class返回给系统,结束了!
- 如果没找到:
引导给扩展返回了一个null,扩展会自己去自己的地盘,去寻找A类
- 如果找到了,那么加载之,然后返回A对应的Class对象给系统,结束了!
- 如果没找到
扩展返回一个null给系统了,系统去自己的地盘(应用程序下)加载A类
- 如果找到了,那么加载之,然后返回这个Class,结束了!
- 如果没找到,抛出异常ClassNotFoundException
5. 类的解析过程
class MyApp {//被系统加载
main() {
A a = new A();//也由系统加载
String s = new String();//也由系统加载!
}
}
class String {//引导
private Integer i;//直接引导加载
}
=====================
6.自定义类加载器
- 继承ClassLoader
- 重写findClass()
=====================
7. Tomcat的类加载器
Tomcat提供了两种类加载器!
- 服务器类加载器:${CATALINA_HOME}\lib,服务器类加载器,它负责加载这个下面的类!
- 应用类加载器:KaTeX parse error: Undefined control sequence: \WEB at position 15: {CONTEXT_HOME}\̲W̲E̲B̲-INF\lib、{CONTEXT_HOME}\WEB-INF\classes,应用类加载器,它负责加载这两个路径下的类!
特性:
服务器类加载器:先自己动手,然后再去委托
应用类加载器::先自己动手,然后再去委托
Tomcat类加载器优先级