赞
踩
目录
虚拟机的类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。
Java类加载器
Java类加载器(Java Classloader)负责动态地将Java类加载到Java虚拟机的内存空间内, 是Java运行时环境(Java Runtime Environment)的一部分,JVM默认有3个类加载器,每个类加载器负责加载特定位置的Java类:
启动类加载器
1、Bootstrap ClassLoader(引导类或启动类加载器):该类加载器通常由C++语言实现,不继承任何Java类,负责加载System.getProperty("sun.boot.class.path")所指定核心Java库,也可以通过java -Xbootclasspath指定其搜索路径;
public class Test { public static void main(String[] args) { System.out.println(System.getProperty("sun.boot.class.path")); } }结果:
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\resources.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\rt.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\sunrsasign.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jsse.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jce.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\charsets.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jfr.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\classes扩展类加载器
2、ExtClassLoader(扩展类加载器):该类加载器由sun.misc.Launcher$ExtClassLoader类实现,负责加载System.getProperty("java.ext.dirs")所指定的Java的扩展库,也可以通过java -Djava.ext.dirs指定其搜索路径,例如:java -Djava.ext.dirs=d:\classes HelloWorld;注意:如果将自己开发的 jar 文件放在System.getProperty("java.ext.dirs")所指定的目录中,也会被 ExtClassLoader类加载器加载;
public class Test { public static void main(String[] args) { System.out.println(System.getProperty("java.ext.dirs")); } }结果:
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext; C:\Windows\Sun\Java\lib\ext应用程序类加载器
3、AppClassLoader(系统类或应用程序类加载器):该类加载器由sun.misc.Launcher$AppClassLoader类实现,负责加载System.getProperty("java.class.path")或CLASSPATH环境变量所指定的Java类,也可以加上-cp来覆盖原有的classpath设置,例如: java -cp ./classes HelloWorld;说明:默认情况下自定义类都由该类加载器加载。如果应用程序中没有自定义的类加载器,一般情况下这就是程序中默认的类加载器。
public class Test { public static void main(String[] args) { System.out.println(System.getProperty("java.class.path")); } }结果:
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\resources.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\rt.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jsse.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jce.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\charsets.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jfr.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-32.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar; D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar; D:\workspace\test\bin ****自命名类所存在的路径
双亲委派模型
Java虚拟机中的所有类加载器采用具有父子关系的树形结构进行组织: 除了顶层的启动类加载器以外,其他的类加载器都应当有自己的父类加载器。
public class Test { public static void main(String[] args) { ClassLoader classLoader =Test.class.getClassLoader(); System.out.println(classLoader.getClass().getName());//控制台输出结果sun.misc.Launcher$AppClassLoader classLoader=classLoader.getParent(); System.out.println(classLoader.getClass().getName());//控制台输出结果sun.misc.Launcher$ExtClassLoader classLoader=classLoader.getParent(); //(引导类加载器):该类加载器通常由C++语言实现,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。