这篇文章主要讲解了“怎么理解Java类加载器和类加载机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java类加载器和类加载机制”吧!
一 点睛
1 类加载器负责将.class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.Class对象。
2 当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构:
Bootstrap ClassLoader:根类加载器。
Extension ClassLoader:扩展类加载器。
System ClassLoader:系统类加载器。
3 JVM的类加载机制主要有如下三种机制:
全盘负责:所谓全盘负责,就是说当一个类加载器负责加载某个Class的时候,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显式使用另外一个类加载器来载入。
父类委托:所谓父类委托则是先让parent(父)类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。
缓存机制:缓存机制将会保证所有被加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存中搜寻该Class,只有当缓存中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,并存入cache。这就是为什么我们修改了Class后,程序必须重新启动JVM,程序所作的修改才会生效的原因。
二 实战
1 代码
import java.net.*;public class BootstrapTest{ public static void main(String[] args) { // 获取根类加载器所加载的全部URL数组 URL[] urls = sun.misc.Launcher. getBootstrapClassPath().getURLs(); // 遍历、输出根类加载器加载的全部URL for (int i = 0; i < urls.length; i++) { System.out.println(urls[i].toExternalForm()); } }}
2 运行
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/resources.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/rt.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/sunrsasign.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/jsse.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/jce.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/charsets.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/jfr.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/classes
三 实战
1 代码
import java.util.*;import java.net.*;import java.io.*;public class ClassLoaderPropTest{ public static void main(String[] args) throws IOException { // 获取系统类加载器 ClassLoader systemLoader = ClassLoader.getSystemClassLoader(); System.out.println("系统类加载器:" + systemLoader); /* 获取系统类加载器的加载路径——通常由CLASSPATH环境变量指定 如果操作系统没有指定CLASSPATH环境变量,默认以当前路径作为 系统类加载器的加载路径 */ Enumeration<URL> em1 = systemLoader.getResources(""); while(em1.hasMoreElements()) { System.out.println(em1.nextElement()); } // 获取系统类加载器的父类加载器:得到扩展类加载器 ClassLoader extensionLader = systemLoader.getParent(); System.out.println("扩展类加载器:" + extensionLader); System.out.println("扩展类加载器的加载路径:" + System.getProperty("java.ext.dirs")); System.out.println("扩展类加载器的parent: " + extensionLader.getParent()); }}
2 运行
系统类加载器:sun.misc.Launcher$AppClassLoader@18b4aac2file:/E:/Java/IDEA_Java/out/production/IDEA_Java/扩展类加载器:sun.misc.Launcher$ExtClassLoader@14ae5a5扩展类加载器的加载路径:D:\Program\Java\jdk1.8.0_162\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext扩展类加载器的parent: null
感谢各位的阅读,以上就是“怎么理解Java类加载器和类加载机制”的内容了,经过本文的学习后,相信大家对怎么理解Java类加载器和类加载机制这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。