千家信息网

Java类加载器的组织结构是什么

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"Java类加载器的组织结构是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java类加载器的组织结构是什么"吧!首先回顾一下,jav
千家信息网最后更新 2026年11月03日Java类加载器的组织结构是什么

本篇内容主要讲解"Java类加载器的组织结构是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java类加载器的组织结构是什么"吧!

首先回顾一下,java虚拟机载入java类的步骤:java文件经过编译器编译后变成字节码文件(.class文件),类加载器 (ClassLoader)读取.class文件,并且转换成java.lang.Class的一个实例,***通过newInstance方法创建该类的 一个对象。ClassLoader的作用就是根据一个类名,找到对应的字节码,根据这些字节码定义出对应的类,该类就是java.lang.Class的 一个实例。

类加载器的组织结构

java有三个初始类加载器,当java虚拟机启动时,它们会按照以下顺序启动:Bootstrap classloader -> extension classloader -> system classloader。三者的关系:bootstrap classloader是extension classloader的parent,extension classloader是system classloader的parent。

bootstrap classloader

它是最原始的类加载器,并不是由java代码写的,是由原生代码编写的。Java有一次编译、所有平台运行的效果,就是因为它写了一份功能相同,但针对不同平台不同语言实现的底层代码。它负责加载java核心库,大家可运行以下代码,看看自己本地的java核心库在哪里:

URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs(); for (int i = 0; i < urls.length; i++) { System.out.println(urls[i].toExternalForm()); }

本人的运行结果:

file:/home/eric/jdk1.6.0_35/jre/lib/resources.jar file:/home/eric/jdk1.6.0_35/jre/lib/rt.jar file:/home/eric/jdk1.6.0_35/jre/lib/sunrsasign.jar file:/home/eric/jdk1.6.0_35/jre/lib/jsse.jar file:/home/eric/jdk1.6.0_35/jre/lib/jce.jar file:/home/eric/jdk1.6.0_35/jre/lib/charsets.jar file:/home/eric/jdk1.6.0_35/jre/lib/modules/jdk.boot.jar file:/home/eric/jdk1.6.0_35/jre/classes

extension classloader

它用来加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或java.ext.dirs系统属性指定的)JAR的类包。注意,因为它是bootstrap classloader加载的,所以当你运行:

ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();
System.out.println("the parent of extension classloader : "+extensionClassloader.getParent());

输出的是:the parent of extension classloader : null

system classloader

它用于加载classpath目录下的jar包,我们写的java类,一般都是由它加载,除非你自己制定个人的类加载器。

全盘负责委托机制

classloader加载类时,使用全盘负责委托机制,可以分开两部分理解:全盘负责,委托。

全盘负责机制:若类A调用了类B,则类B和类B所引入的所有jar包,都由类A的类加载器统一加载。

委托机制:类加载器在加载类A时,会优先让父加载器加载,当父加载器加载不到,再找父父加载器,一直找到bootstrap classloader都找不到,才自己去相关的路径去寻找加载。以下是ClassLoader的源码:

protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException     { // First, check if the class has already been loaded Class c = findLoadedClass(name); if (c == null) {     try {   if (parent != null) {       //从父加载器加载       c = parent.loadClass(name, false);   } else {       //从bootstrap loader加载       c = findBootstrapClassOrNull(name);   }     } catch (ClassNotFoundException e) {                 // ClassNotFoundException thrown if class not found                 // from the non-null parent class loader             }             if (c == null) {         // If still not found, then invoke findClass in order         // to find the class.         c = findClass(name);     } } if (resolve) {     resolveClass(c); } return c;     }

举个例子,类加载器加载类A的过程:

1,判断是否已经加载过,在cache里面查找,若有,跳7;否则下一步

2,判断当前加载器是否有父加载器,若无,则当前为ext classloader,跳去4;否则下一步

3,请求父加载器加载该类,若加载成功,跳7;若不成功,即父加载器不能找到该类,跳2

4,请求jvm的bootstrap classloader加载,若加载成功,跳7;若失败,跳5

5,当前加载器自己加载,若成功,跳7;否则,跳6

6,抛出ClassNotFoundException

7,返回Class

编写自己的类加载器

Java加载类的过程,实质上是调用loadClass()方法,loadClass中调用findLoadedClass()方法来检查该类是否 已经被加载过,如果没有就会调用父加载器的loadClass(),如果父加载器无法加载该类,就调用findClass()来查找该类。

所以我们要做的就是新建MyClassLoader继承java.lang.ClassLoader,重写其中的findClass()方法。主要是重新设计查找字节码文件的方案,然后调用definedClass来返回。

到此,相信大家对"Java类加载器的组织结构是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

文件 方法 组织结构 结构 成功 代码 字节 就是 机制 委托 运行 是由 编译 不同 内容 实例 平台 核心 目录 过程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 喔噻互联网科技有限公司 新华互联网科技学校 互联网的科技创新 狮子座互联网科技 碳银互联网科技有限公司 互联网金融中的现代科技 青岛科技大学互联网大赛研究生 互联网科技与大数据专业 青海科技产业互联网发展 烟台灵鸽互联网科技有限公司 广州富喜互联网络科技 杭州披云加互联网科技有限公司 产业互联网科技服务公司 富国互联网金融科技混合基金 上海互联网科技公司ppt 互联网硬科技公司 陕西九四连强互联网科技有限公司 长沙易易互联网科技有限公司 安徽九吞吴互联网科技有限公司 互联网科技排名 宜安科技 互联网金融 百单互联网科技有限公司 互联网科技网站 科技类的互联网平台 青岛科技大学互联网大赛研究生 哈尔滨屹滨互联网科技有限公司 内蒙古九一互联网科技 互联网科技创新的路径 有人说阿里系是互联网科技企业
0