loadClass的类加载过程为:
1.加载:jvm通过磁盘IO将文件加载到虚拟机中。加载中会在内存中生成一个class对象,通过这个对象可以作为访问的入口去访问方法区的数据
2.验证:验证class类文件的格式是否正确合法,比如开头cafebabe
3.准备:解析静态变量,分配内存,以及分配初始默认值
4.解析:静态链接,将静态方法替换为所存数据的地址的指针
5.初始化:给静态变量赋值
类加载器的分类
1.引导类加载器:加载位于jre目录下lib核心的jar包
2.扩展类加载器:加载位于ext下的扩展类jar包
3.应用程序类加载器:主要加载自己编写的classpath下的jar包
4.自定义类加载器:可以自定义加载路径
jvm加载类的机制以及双亲委派机制
1.jvm会启用应用程序加载器(如果有自定义加载器则使用自定义加载器)去加载这个类,即首先使用最底层加载器作为入口。
2.找到最底层加载器之后,加载器并不直接去加载该类,而是向上委托父类加载去加载,即:
第一步,去查找是否已经加载过该类,如果加载过就直接使用,不去重复加载,如果没有加载过,就去执行
第二步,即查找是否有父类加载器,如果有,就去加载父类加载器,在父类加载器负责加载的目录jar包中去查找是否有该类,如果有就去加载该类,如果没有,就重复执行第二步,如果该加载器没有父加载器了,就去执行
第三步,此时加载器是引导类加载器,没有父加载器,该加载器会去在负责加载的目录jar包中去查找是否有该类,如果有就去加载该类,如果没有,则会调用子加载器,此时子加载器(扩展类加载器)肯定也没有加载过此类,就会接着让该加载器的子加载器去加载,直到该加载器没有子加载器,就去执行
第四步,该加载器去加载此类,加载完成后会在内存中生成该类的一个class类对象,以便后期去访问方法区中的该类的数据
双亲委派机制的好处:
1.防止类的重复加载
2.防止核心类被修改
双亲委派机制的缺点:不能加载两个全类名一样但是功能不同的类,所以tomcat要打破双亲委派机制,方法是:编写自定义加载器,即需要继承java.lang.ClassLoader 类,然后重写loadclass方法,机制修改为:如果该加载器找不到该类,便不向上委托给父加载器,而是自己去加载。tomcat机制为:每有一个war包发布部署,tomcat就会给这个war包生成一个自己的类加载器,供这个war包单独去使用~~~~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。