类加载器和类加载机制

冷不防 2021-09-29 08:10 638阅读 0赞

一 点睛

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 代码

  1. import java.net.*;
  2. public class BootstrapTest
  3. {
  4. public static void main(String[] args)
  5. {
  6. // 获取根类加载器所加载的全部URL数组
  7. URL[] urls = sun.misc.Launcher.
  8. getBootstrapClassPath().getURLs();
  9. // 遍历、输出根类加载器加载的全部URL
  10. for (int i = 0; i < urls.length; i++)
  11. {
  12. System.out.println(urls[i].toExternalForm());
  13. }
  14. }
  15. }

2 运行

  1. file:/D:/Program/Java/jdk1.8.0_162/jre/lib/resources.jar
  2. file:/D:/Program/Java/jdk1.8.0_162/jre/lib/rt.jar
  3. file:/D:/Program/Java/jdk1.8.0_162/jre/lib/sunrsasign.jar
  4. file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jsse.jar
  5. file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jce.jar
  6. file:/D:/Program/Java/jdk1.8.0_162/jre/lib/charsets.jar
  7. file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jfr.jar
  8. file:/D:/Program/Java/jdk1.8.0_162/jre/classes

三 实战

1 代码

  1. import java.util.*;
  2. import java.net.*;
  3. import java.io.*;
  4. public class ClassLoaderPropTest
  5. {
  6. public static void main(String[] args)
  7. throws IOException
  8. {
  9. // 获取系统类加载器
  10. ClassLoader systemLoader = ClassLoader.getSystemClassLoader();
  11. System.out.println("系统类加载器:" + systemLoader);
  12. /*
  13. 获取系统类加载器的加载路径——通常由CLASSPATH环境变量指定
  14. 如果操作系统没有指定CLASSPATH环境变量,默认以当前路径作为
  15. 系统类加载器的加载路径
  16. */
  17. Enumeration<URL> em1 = systemLoader.getResources("");
  18. while(em1.hasMoreElements())
  19. {
  20. System.out.println(em1.nextElement());
  21. }
  22. // 获取系统类加载器的父类加载器:得到扩展类加载器
  23. ClassLoader extensionLader = systemLoader.getParent();
  24. System.out.println("扩展类加载器:" + extensionLader);
  25. System.out.println("扩展类加载器的加载路径:"
  26. + System.getProperty("java.ext.dirs"));
  27. System.out.println("扩展类加载器的parent: "
  28. + extensionLader.getParent());
  29. }
  30. }

2 运行

  1. 系统类加载器:sun.misc.Launcher$AppClassLoader@18b4aac2
  2. file:/E:/Java/IDEA_Java/out/production/IDEA_Java/
  3. 扩展类加载器:sun.misc.Launcher$ExtClassLoader@14ae5a5
  4. 扩展类加载器的加载路径:D:\Program\Java\jdk1.8.0_162\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
  5. 扩展类加载器的parent: null

发表评论

表情:
评论列表 (有 0 条评论,638人围观)

还没有评论,来说两句吧...

相关阅读

    相关 机制

    类加载器: 执行”通过一个类的全限定名来获取描述此类的二进制字节流“这个步骤的代码模块称为“类加载器“,类加载器虽然只用于实现类的加载动作,但是他的作用不是仅限于此,...

    相关 ——

    虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作

    相关 机制

    一 点睛 1 类加载器负责将.class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.Class对象。 2 当JVM启动时,会形成由