类加载是java运行的第一步,研究 类加载有助于了解JVM执行过程,并指导开发者采取更有效的方式配合程序执行;
研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性。
一、简单过程:
java程序运行的场所是内存,当在命令行下执行:java HelloClassLoader的时候,JVM会将HelloClassLoader.class加载到内存中,并形成一个HelloClassLoader对象。
其中的加载过程就是类加载过程:
1.寻找jre目录,查找jvm.dll,并初始化JVM;
2.产生一个Bootstrap Loader(启动类加载器);
3.Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设置为Bootstrap Loader;
4.Extended Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设置为Extended Loader;
5.最后由AppClass Loader加载HelloClassLoader类。
以上就是类加载的最一般的过程。
二、类加载器的特点:
1.运行一个程序时,总是由AppClassLoader(系统类加载器)开始加载指定的类;
2.在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载;
3.Bootstrap Loader(启动类加载器)是最顶级的加载器了,其父类加载器为null。
如下:
1 package com.qad.classLoader; 2 3 public class HelloClassLoader { 4 public static void main(String [] args){ 5 HelloClassLoader helloClassLoader = new HelloClassLoader(); 6 Class c = helloClassLoader.getClass(); 7 ClassLoader classLoader = c.getClassLoader(); 8 System.out.println(classLoader); 9 System.out.println(classLoader.getParent()); 10 System.out.println(classLoader.getParent().getParent()); 11 } 12 13 }
结果是:
sun.misc.Launcher$AppClassLoader@addbf1 sun.misc.Launcher$ExtClassLoader@42e816 null