java的类加载器
1.什么是类加载器:
所谓类加载器就是把.class文件加载到jvm的方法区内,变成一个Class对象 。
2.类加载器的作用:
首先说明,类加载器是每一个类在创建的时候都会使用的一个“引路人”,它把.class文件“指引到”jvm的方法区 ,变成一个Class对象,然后进行使用,也可以这么说,类加载器就是jvm的一个左膀右臂或者是“小兵”。
3.类加载的名称:
ClassLoader
4.创建对象的具体过程
ClassLoader把.class文件读入内存的方法区,并且执行静态代码块和静态初始化语句------>执行new,在堆内存中创建一个空白对象-------->调用构造器和子类调用父类构造器--------->执行构造器内的逻辑并且为非静态成员变量赋初值,
5.类加载器的分类:
java虚拟机一共分成三类,每一类都有自己的职能,但是有“范围”和“权力”的大小
从大到小依次是:引导:专门负责加载\jdk1.7.0_80\jre\lib\rt.jar,下的类
扩展类加载器:专门负责扩展的类加载器
系统类加载:专门负责classpath下的类也就是项目下的\bin,这个包括项目下的.class,程序员自己写的类,以及第三方jar
6.如何获得类加载器:
在Class类里有一个getClassLoader()方法,可以获取类加载器。
7.类加载器的委托机制:
当程序员在new一个类的时候系统类加载器就会去加载这个类------>但是此时它并不会马上加载而是先去询问扩展类记载器是否可以加载------->同样扩展类加载器也不会马上加载而是回去询问引导能问加载------->如果引导在rt.jar下找到了相关.class文件,那么就会加载这个文件并返回此对象-------->如果引导没有找到那么就会返回null,通知扩展类加载器去加载----->同样的道理,如果扩展类加载器有次文件,那么加载并返回对象-------->否则返回null----------->此时轮到系统类加载器加载文件,发现有此文件,那么会生成此对象------->如果没有那么就会抛出异常ClassNotFoundException
8.类加载器的委托机制的好处:
有人会问,类加载的委托机制这么复杂,为什么还要用呢?答案就是为了安全,试想一下,如果系统类记载器直接就找到并加载这个类,那么是否一个居心叵测的人写了一个和jdk里面同名的类型比如String ,是不是就会加载这个类型,而不去加载rt.jar下的类型了呢,而此时jvm内很多方法都依赖String类型,是不是也就不能用了呢。所以这种方式可以保证类加载的绝对安全!!!
9.类加载器解析类的过程:
public class Tset {//由系统类加载加载
public static void main(String[] args) {
Demo d = new Demo();//由系统类加载器加载
String a =new String("aaa");//由系统类加载器加载
}
}
class Demo{
}
类内部的对象由那个类加载器加载取决于这个对象所在的类由那个类加载器加载。
Tomcat的类加载器
Tomcat提供了两个类加载器,所以在javaweb项目的时候导入第三方jar的时候,导入到web项目的WEB-INF/lib就可以,
这两个累加器分别是:
* 服务器类加载器:负责加载${CATALINA_HOME}\lib下面的类!
* 应用类加载器:负责加载${CONTEXT_HOME}\WEB-INF\lib、${CONTEXT_HOME}\WEB-INF\classes,这两个路径下的类!
总体顺序排序
引导
扩展扩展类加载器
系统类类加载器
服务器类加载器
应用类加载器:
但是这两个类加载器有一个特点,就是不具备委托机制,所以在做javaweb项目的时候一定不要把 ${CONTEXT_HOME}\WEB-INF\lib下的jar放到${CATALINA_HOME}\lib