java中的类加载器
一、什么是类加载器
* 把.class文件加载到JVM的方法区中,变成一个Class对象 !
二、得到类加载器
* Class # getClassLoader()
三、类加载器的分类
* 引导类加载器:加载类库里面的类
* 扩展类加载器:加载扩展jar包里面的类
* 系统类加载器:加载应用下的class,包含开发人员写的类,和第三方的jar包!classpath下的类!
系统类加载器的上层领导:扩展类加载器
扩展类加载器的上层领导:引导加载器
引导加载器没上层,它是BOSS
四、类加载器的委托机制
* 代码中出现了这么一行:new A();
> 系统发现了自己加载的类,其中包含了new A(),这说明需要系统去加载A类
> 系统会委托自己的领导:让扩展去自己的地盘去加载A类
> 扩展会委托自己的领导:让引导去自己的地盘去加载A类
> 引导自己真的去rt.jar中寻找A类
* 如果找到了,那么加载之,然后返回A对应的Class对象给扩展,扩展也会它这个Class返回给系统,结束了!
* 如果没找到:
> 引导给扩展返回了一个null,扩展会自己去自己的地盘,去寻找A类
* 如果找到了,那么加载之,然后返回A对应的Class对象给系统,结束了!
* 如果没找到
> 扩展返回一个null给系统了,系统去自己的地盘(应用程序下)加载A类
* 如果找到了,那么加载之,然后返回这个Class,结束了!
* 如果没找到,抛出异常ClassNotFoundException
ps:谁加载了当前类,如果当前类里面需要加载其他类,则需要加载的其他类也由这个加载器加载,加载过程依然符合委托机制。
五、Tomcat的类加载器
Tomcat提供了两种类加载器
* 服务器类加载器:${CATALINA_HOME}\lib,它负责加载这个下面的类!
* 应用类加载器:${CONTEXT_HOME}\WEB-INF\lib、${CONTEXT_HOME}\WEB-INF\classes,应用类加载器,它负责加载这两个路径下的类!
特性:
服务器类加载器:先自己加载,然后在去委托
应用类加载器:先自己加载,然后再去委托
加载顺序: