一、先看看编写出的代码的执行过程:

二、研究类加载机制的意义

从上图可以看出,类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。

研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性。
三、类加载的一般过程
原理:双亲委托模式
1、寻找jre目录,寻找jvm.dll,并初始化JVM;
2、产生一个Bootstrap Loader(启动类加载器);
3、Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为Bootstrap Loader。
4、Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设为Extended Loader。
5、最后由AppClass Loader加载HelloWorld类。
四、类加载器的特点
1、运行一个程序时,总是由AppClass Loader(系统类加载器)开始加载指定的类。
2、在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。 
3、Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.
五、类加载器的获取
很容易,看下面例子
public  class HelloWorld {  
         public  static  void main(String[] args) {  
                 HelloWorld hello =  new HelloWorld();  
                 Class c = hello.getClass();  
                 ClassLoader loader = c.getClassLoader();  
                 System.out.println(loader);  
                 System.out.println(loader.getParent());  
                 System.out.println(loader.getParent().getParent());  
         }  
}
打印结果:
sun.misc.Launcher$AppClassLoader@19821f  
sun.misc.Launcher$ExtClassLoader@addbf1  
null  
从上面的结果可以看出,并没有获取到ExtClassLoader的父Loader,原因是Bootstrap Loader(启动类加载器)是用C语言实现的,找不到一个确定的返回父Loader的方式,于是就返回null。
六、类的加载
类加载有三种方式:
1、命令行启动应用时候由JVM初始化加载
2、通过Class.forName()方法动态加载
3、通过Class.getClassLoader().loadClass()方法动态加载
三种方式区别比较大,看个例子就明白了:
package zhongqiu.common.base;public class ClassLoadDemo {static {System.out.println("ClassLoadDemo静态初始化块执行了!");}public static void main(String[] args) throws ClassNotFoundException {ClassLoader loader2 = ClassLoadDemo.class.getClassLoader();System.out.println(loader2);// 使用ClassLoader.loadClass()来加载类,不会执行初始化块// loader2.loadClass("zhongqiu.test.Test");// 使用Class.forName()来加载类,默认会执行初始化块// Class.forName("zhongqiu.test.Test");// 使用Class.forName()来加载类,并指定ClassLoader,初始化时不执行静态块Class.forName("zhongqiu.test.Test", false, loader2);}
}

七、自定义ClassLoader

package zhongqiu.common.base.classload;import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;public class MyClassLoader {@SuppressWarnings("resource")public static void main(String[] args)throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException {URL url = new URL("file:/D:/javaworkspace/JavaCommon/src/");ClassLoader myloader = new URLClassLoader(new URL[] { url });Class c = myloader.loadClass("zhongqiu.common.base.classload.Test");Test t3 = (Test) c.newInstance();}
}

在Java.lang包里有个ClassLoader类,ClassLoader 的基本目标是对类的请求提供服务,按需动态装载类和资
源,只有当一个类要使用(使用new 关键字来实例化一个类)的时候,类加载器才会加载这个类并初始化。
一个Java应用程序可以使用不同类型的类加载器。例如Web Application Server中,Servlet的加载使用开发
商自定义的类加载器, java.lang.String在使用JVM系统加载器,Bootstrap Class Loader,开发商定义的其他类
则由AppClassLoader加载。在JVM里由类名和类加载器区别不同的Java类型。因此,JVM允许我们使用不同
的加载器加载相同namespace的java类,而实际上这些相同namespace的java类可以是完全不同的类。这种
机制可以保证JDK自带的java.lang.String是唯一的。

八、

为什么要使用这种双亲委托模式呢?

  1. 因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
  2. 考虑到安全因素,我们试想一下,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的ClassLoader。

转载于:https://www.cnblogs.com/wangzhongqiu/p/6417955.html

【JVM】4、JVM类加载机制相关推荐

  1. jvm运行时类加载机制_JVM体系结构:JVM类加载器和运行时数据区

    jvm运行时类加载机制 各位读者好! 在JVM系列的上一篇文章中,开发人员了解了Java虚拟机(JVM)及其体系结构. 本教程将帮助开发人员正确回答以下主题的问题: ClassLoader子系统 运行 ...

  2. JVM基础 - JAVA类加载机制

    JVM基础 - JAVA类加载机制 类的生命周期 其中类加载的过程包括了 加载 . 验证 . 准备 . 解析 . 初始化 五个阶段.在这五个阶段中, 加载 . 验证 . 准备 和 初始化 这四个阶段发 ...

  3. 深入理解JVM(5)——虚拟机类加载机制

    在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用.而虚拟机中,而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机中会发生什么变化?本文将逐步解答这些问题 ...

  4. 【深入理解JVM】ClassLoader类加载机制

    Java程序并不是一个原生的可执行文件,而是由许多独立的类文件组成,每一个文件对应一个Java类.此外,这些类文件并非立即全部装入内存的,而是根据程序需要装入内存.ClassLoader专门负责类文件 ...

  5. jvm(7)-虚拟机类加载机制

    [0]README 0.1)本文转自"深入理解jvm",旨在学习  虚拟机类加载机制 的基础知识: [1]概述 1)类加载机制:虚拟机把描述类的数据从Class 文件加载到内存,并 ...

  6. fegin需要实现类_深入理解JVM(六)--虚拟机类加载机制

    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存开始,到卸载出内存为止 ...

  7. [JVM]了断局: 类加载机制

    一.类加载的时机 二. 有且只有六种情况必须立即对类进行"初始化" 三.类加载的过程 1.加载 2.验证 1.文件格式验证 2.元数据验证 3.字节码验证 4.符号引用验证 3.准 ...

  8. 深入理解JVM之虚拟机类加载机制

    1.概述 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制.与那些在编译时需要进 ...

  9. JVM专题之类加载机制

    一 类加载是什么?什么时候加载类?加载过程是怎么样的? 1.1 什么是类加载 类加载就是指将在硬盘上编译好的class字节码文件,加载到JVM内存中,然后对字节码文件进行链接和初始化的过程.只有加载后 ...

  10. 探究java-JVM的五步(三步)类加载机制(包含类加载过程的一些代码书写,如类加载代码)

    前言: 写了不少java代码,以前一直都是关心java程序跑起来后的情况步骤,今天我们就来探究一下: 在java程序还是一个个存在于静态.class文件中的类(也可以是任何被JVM认可的文件,但本质还 ...

最新文章

  1. 监控某个进程,如果不存在就自动重启
  2. 2017年前端面试题整理汇总100题
  3. javascript优化--13模式1(DOM和浏览器模式)
  4. 《研磨设计模式》chap9 原型模式Prototype
  5. wxWidgets:wxRearrangeDialog类用法
  6. turtle库基础练习
  7. ant 走马灯面板指示显示不出来_触摸屏报警信息显示设置方法
  8. 嵌入式软件工程师笔试题
  9. Linux之间配置SSH互信(SSH免密码登录)
  10. RE-Base64编码分析
  11. python模拟实现QQ邮箱登录
  12. A/Btest (A/B测试)的营销策略效果分析
  13. 电机速度曲线规划_S曲线
  14. node mysql timeout_Error: Handshake inactivity timeout in Node.js MYSQL module
  15. c++中如何将数组赋值给vector
  16. 记一个跟阿里的朋友喝酒的周末-20211201
  17. Django实现excel导入数据库(超详细)
  18. 人脑的计算能力有多强?
  19. 计算机应用基础高等数学试题,大专高等数学期末试卷(A卷)带答案.doc
  20. 张文中复出,物美首次披露新零售转型内幕

热门文章

  1. Java至尊红颜_智能手机跨时代大作 摩托MPx220登场
  2. 大数据预测实战-随机森林预测实战(三)-数据量对结果影响分析
  3. 复练-软考网规-下午案例题考点和答题技巧
  4. mac 用户 文件夹 权限_WIN7局域网文件分权限共享设置方法
  5. 基于Tkinter和百度Aip的人体关键点检测
  6. matlab 波前像差,波前像差原理及应用
  7. Mac安装mysql数据库【亲测有用】
  8. 华为认证HCNA-IoT物联网工程师培训视频
  9. 渗透测试入门6之权限提升
  10. 200个c语言程序(由简单到复杂),200个c语言程序(由简单到复杂)