J2SE(五)Java之类的加载机制

为什么要研究java类的加载机制:

(1)有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。
(2)让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性。

什么是java类的加载机制:

        Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

java类加载过程:

Java程序运行在内存中,当执行java className命令时,JVM会将className.class加载到内存中,并形成一个Class的对象className.class。
其过程如下:
(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类。

上面就是java类加载的基本过程,其流程图如下:

J2SE(五)Java之类的加载机制_第1张图片

类加载器搜索目录查看:

for (Map.Entry<Object, Object> entry : System.getProperties().entrySet()) {
      System.out.println(entry.getKey() + "\t" + entry.getValue());
}
类加载器类别:

Bootstrap Loader(启动类加载器):

      加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等。
Extended Loader(标准扩展类加载器ExtClassLoader):

     负责加载java扩展类,主要是 %JRE_HOME/lib/ext 目录下的jar和class
AppClass Loader(系统类加载器AppClassLoader):

    负责加载当前java应用的classpath中的所有类HelloWorld

类加载器特点:

1、运行一个程序时,总是由AppClass Loader(系统类加载器)开始加载指定的类。
2、在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载(双亲委派机制)。
3、Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.

       JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载 。

类的加载方式:

类加载有三种方式:
1、命令行启动应用时候由JVM初始化加载
2、通过Class.forName()方法动态加载
3、通过ClassLoader.loadClass()方法动态加载


你可能感兴趣的:(J2SE)