当前位置:主页 > java教程 >

Java类加载器和类加载机制实例分析

发布:2023-02-28 14:30:22 120


我们帮大家精选了Java类相关的编程文章,网友文英悟根据主题投稿了本篇教程内容,涉及到Java、类加载器、类加载机制相关内容,已被465网友关注,下面的电子资料对本篇知识点有更加详尽的解释。

本文实例讲述了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.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/rt.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/sunrsasign.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jsse.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jce.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/charsets.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jfr.jar
file:/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@18b4aac2
file:/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常用工具类 UUID、Map工具类、XML工具类、数据验证工具类

    发布:2019-05-31

    这篇文章主要为大家详细介绍了java常用工具类,UUID、Map工具类、XML工具类、数据验证工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • java中用ObjectMapper类实现Json与bean的转换示例

    发布:2022-10-26

    给大家整理一篇关于java的教程,这篇文章主要给大家介绍了关于在java中用ObjectMapper类实现Json与bean转换的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着


  • Java中ClassLoader类加载原理用法

    发布:2019-06-23

    本篇文章主要给大家讲述了Java中ClassLoader类加载的原理以及用法总结,一起学习下。


  • java不允许类多重继承却允许接口多重继承的原因

    发布:2021-05-22

    这篇文章主要介绍了java为什么不允许类多重继承却允许接口多重继承,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起


  • 详解java基本数据类型传递与引用传递区别

    发布:2020-02-05

    这篇文章主要介绍了java基本数据类型传递与引用传递区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • Java多线程Atomic包操作原子变量与原子类详解

    发布:2023-01-11

    给网友朋友们带来一篇关于Java的教程,这篇文章主要介绍了Java多线程Atomic包操作原子变量与原子类详解,简单介绍了Atomic,同时涉及java.util.concurrent中的原子变量,Atomic类的作用等相关内容,具有一定参考价值,需要的朋友可以了解


  • Java Unsafe类实现原理及测试代码

    发布:2021-04-08

    这篇文章主要介绍了Java Unsafe类实现原理及测试代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下


  • Java语言Lang包下工具类详解

    发布:2021-06-09

    这篇文章主要介绍了Java语言Lang包下常用的工具类介绍,次奥变觉得挺不错的,这里分享给大家,需要的朋友可以参考下。


  • Java面向对象编程中类的继承用法总结

    发布:2019-06-10

    这篇文章主要介绍了Java面向对象编程之类的继承,结合实例形式较为详细的分析了Java面向对象编程类的概念、功能、使用方法及相关注意事项,需要的朋友可以参考下


  • Java中MD5加密工具类实例分享

    发布:2019-06-19

    这篇文章主要介绍了Java语言描述MD5加密工具类实例代码,具有一定借鉴价值,需要的朋友可以参考下。


网友讨论