JAVA基础 - 如何使用ClassLoader?

news2024/12/24 11:41:12

1. CLASSLOADER是什么

ClassLoader,类加载器。用于将CLASS文件动态加载到JVM中去,是所有类加载器的基类(Bootstrap ClassLoader不继承自ClassLoader),所有继承自抽象的ClassLoader的加载器,都会优先判断是否被父类加载器加载过,防止多次加载。

官网的JVM:https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf

2. 三个默认CLASSLOADER

①. BootStrap ClassLoader : 启动类加载器,加载JAVA核心类库。它是JVM的一部分,主要加载JVM自身工作所需要的类。
②. Extension ClassLoader : 扩展类加载器,加载目录%JRE_HOME%\lib\ext目录下的JAR包和CLASS文件。
③. Application ClassLoader : 应用程序类加载器,加载应用程序CLASSPATH目录下的所有JAR包和CLASS文件。
在这里插入图片描述

3. 默认CLASSLOADER的关系

(1) 加载关系

①. ExtentionClassLoader的父加载器是BootstrapClassLoader。
②. AppclassLoader的父加载器是ExtentionClassLoader。

(2) 继承关系

①. ExtentionClassLoader对应的是ExtClassLoader.java,父类是java.net.URLClassLoader;
②. AppclassLoader对应的是AppClassLoader.java,父类也是java.net.URLClassLoader;
③. BootstrapClassLoader是C++编写的,没有对应的java类,所以也成不了父类。

(3) 检查顺序和加载顺序

AppClassLoader和ExtClassLoader是Launcher的静态内部类,在程序启动时JVM会创建Launcher对象,Launcher构造器会同时会创建扩展类加载器和应用类加载器。
①. 加载过程中会先检查类是否被已加载,检查顺序是自底向上,从User ClassLoader到BootStrap ClassLoader逐层检查,只要某个CLASSLOADER已加载过此类,就视为此类已被加载,保证此类在所有CLASSLOADER中只被加载一次;加载顺序是自顶向下,从BootStrap ClassLoader到User ClassLoader逐层尝试加载此类;
②. 在加载类时,每个类加载器都会将加载任务上交给其父类,如果其父类找不到,再由自己去加载;
③. Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为NULL。

4. 自定义CLASSLOADER

如果我们自定义一个加载器,一般继承自java.lang.ClassLoader类,或者继承他的子类,比如:java.net.URLClassLoader,此时默认的父加载器是AppClassLoader。具体步骤如下:
①. 继承java.lang.ClassLoader类,或者java.net.URLClassLoader;
②. 重写findClass()方法或者重写loadClass()方法;
③. 在findClass()中使用defineClass()方法,这个方法是父类ClassLoader中的方法。

// 定义一个JAVA类
public class Hello {
    public String say() {
        System.out.println("HELLO WORLD!");
        return "OK";
    }
}

// 自定义类加载器
public class MyClassLoader extends ClassLoader {
    private String path;

    MyClassLoader(String path) {
        this.path = path;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        try {
            File file = new File(this.path.concat(name).concat(".class"));
            FileInputStream in = new FileInputStream(file);
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            byte[] bytes = new byte[1024];
            int length = -1;
            while ((length = in.read(bytes)) != -1) {
                out.write(bytes, 0, length);
            }
            return defineClass(name, bytes, 0, bytes.length);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return super.findClass(name);
    }
}

// 调用测试
public class T {
    public static void main(String[] args) throws Exception {
        String path = Hello.class.getClassLoader().getResource("org/apache/atlas/util/").getPath();
        MyClassLoader my = new MyClassLoader(path);
        // 注意需要带上包路径
        Class<?> cls = my.loadClass("org.apache.atlas.util.Hello");
        Object hello = cls.newInstance();
        Method method = cls.getMethod("say", null);
        method.invoke(hello);
    }
}

5. 使用自定义的CLASSLOADER是否可以热加载CLASS?

①. JAVA目前没有专门的API,来卸载JVM中已加载的类;
②. 要卸载JVM中的类,需要该类的对象都被回收,加载该类的ClassLoader也被回收,使用该类的线程结束等条件;
③. 但是,在JAVA中不同的ClassLoader实例可以加载同一个类,即使CLASS文件是同一个也可以被加载。但是同一个ClassLoader实例不能重复加载同一个类;
④. 综上, 虽然可以热加载CLASS,但是在不停服务的情况下热替换CLASS不是很建议,虽然可以通过新建CLASSLOADER实例的方法来改变新加载的CLASS的内容,但之前CLASSLOADER加载的类和对象并不会被修改,什么时候能被GC回收不可控。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++数据结构:二叉树之二(二叉搜索树)

文章目录 前言一、二叉搜索树的概念二、代码详解1、构建节点2、构建二叉树类3、插入方法4、删除方法5、四种遍历方法6、测试代码 总结 前言 前文已经讲了二叉树概念&#xff0c;并搞出一个数组存储的没写具体实用意义的二叉树&#xff0c;这篇文章将讲解二叉树的另一种存储方式…

限量内测名额释放:微信云开发管理工具新功能

我们一直收到大家关于云数据库管理、快速搭建内部工具等诉求&#xff0c;为了给大家提供更好的开发体验&#xff0c;结合大家的诉求&#xff0c;云开发团队现推出新功能「管理工具」&#xff0c;现已启动内测&#xff0c;诚邀各位开发者参与内测体验。 什么是「管理工具」 管…

当节点内存管理遇上 Kubernetes:自动调度与控制

原理 在现代的容器化环境中&#xff0c;节点资源的管理是一个重要的任务。特别是对于内存资源的管理&#xff0c;它直接影响着容器应用的性能和可用性。在 Kubernetes 中&#xff0c;我们可以利用自动调度和控制的机制来实现对节点内存的有效管理。本文将介绍一种基于 Bash 脚…

EM中等效原理

EM中等效原理 一、基本简介 电磁等效定理对于简化许多问题的解是有用的。此外&#xff0c;它们还提供了对麦克斯韦系统电磁场行为的物理见解。它们与唯一性定理和惠更斯原理密切相关。一个应用是它们在研究来自孔径天线或来自激光腔输出的辐射中的用途。 等效源原理&#xf…

3.2 掌握RDD算子

一、准备工作 &#xff08;一&#xff09;准备文件 1、准备本地系统文件 2、把文件上传到HDFS &#xff08;二&#xff09;启动Spark Shell 1、启动HDFS服务 2、启动Spark服务 3、启动Spark Shell 二、掌握转换算子 &#xff08;一&#xff09;映射算子 - map() …

Sketch在线版免费使用,Windows也能用的Sketch!

Sketch 的最大缺点是它对 Windows/PC 用户不友好。它是一款 Mac 工具&#xff0c;无法在浏览器中运行。此外&#xff0c;使用 Sketch 需要安装其他插件才能获得更多响应式设计工具。然而&#xff0c;现在有了 Sketch 网页版工具即时设计替代即时设计&#xff01; 即时设计几乎…

通达信凹口平量柱选股公式,倍量柱之后调整再上升

凹口平量柱是一组量柱形态&#xff0c;表现为量柱两边高、中间扁平或圆底的形态。如下图所示&#xff0c;左右各有一根高度持平的高量柱&#xff0c;中间夹杂着三五根甚至更多根低量柱。 凹口平量柱选股公式需要结合量柱以及K线&#xff0c;主要考虑以下三点&#xff1a; 1、倍…

git各阶段代码修改回退撤销操作

git push origin master 的含义是将本地当前分支的提交推送到名为 origin 的远程仓库的 master 分支上。 各阶段代码修改回退撤销的操作 case1 git checkout -- . 修改了文件内容但没还有git add 或git commit时撤销当前目录下所有文件的修改 case2 当完成了git add 之后&a…

项目管理:面对未知的挑战时,如何获取和使用信息?

一项实验展示了人们在面对未知的挑战时&#xff0c;对信息的获取和使用的影响。在下面的实验中&#xff0c;三组人被要求步行到十公里外的三个村庄。 第一组人没有任何信息&#xff0c;只跟着向导走。他们在走了短短的两三公里后就开始抱怨和情绪低落&#xff0c;同时感到疲惫…

2022年天府杯全国大学生数学建模竞赛E题地铁线路的运营与规划解题全过程文档及程序

2022年天府杯全国大学生数学建模竞赛 E题 地铁线路的运营与规划 原题再现&#xff1a; 地铁是一种非常绿色快捷的交通出行方式&#xff0c;全国各大城市也都在如火如荼地进行地铁线路建设与规划。但乘坐地铁有时候会感觉特别拥挤&#xff0c;这一时期我们称为高峰期。如何合理…

sqlserver中的merge into语句

merge into语句是用来合并两张表的数据的&#xff0c;比如我们想把一张表的数据批量更新到另外一张表&#xff0c;就可以用merge into语句。具体有哪些业务场景呢&#xff1f; 1.数据同步 2.数据转换 3.基于源表对目标表进行增&#xff0c;删&#xff0c;改的操作。 实践步骤…

JavaScript了解调用带参函数,无参函数的代码

以下为JavaScript了解调用带参函数&#xff0c;无参函数的程序代码和运行截图 目录 前言 一、带参函数 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 二、无参函数 2.1 运行流程及思想 2.2 代码段 2.3 JavaScript语句代码 2.4 运行截图 前言…

让代码创造童话,共建快乐世界:六一儿童节特辑

让代码创造童话&#xff0c;共建快乐世界&#xff1a;六一儿童节特辑 六一儿童节即将来临&#xff0c;这是一个属于孩子们的快乐节日。为了让这个节日更加有趣&#xff0c;我们发起了“让代码创造童话&#xff0c;共建快乐世界”六一活动。在这个活动中&#xff0c;我们邀请您…

使用Tensorrt对YOLOv5目标检测的代码进行加速

文章目录 1. 前言2. 官网3. 安装依赖3.1. 安装OpenCV3.1.1. 安装3.1.2. 添加环境变量3.1.3. 查看版本 3.2. 安装TensorRT3.2.1. 下载3.2.2. 安装3.2.3. 添加环境变量 4. 下载项目5. 生成WTS模型6. cmake6.1. 生成Makefile6.1.1. 配置CMakeLists.txt6.1.1.1. 修改编译依赖的路径…

通过python采集1688商品评论数据封装接口、1688评论数据接口

1688商品评论数据是指在1688网站上对商品的评价和评论信息。这些信息包括买家对商品的使用、品质、包装、服务等方面的评价和意见&#xff0c;可以帮助其他用户更好地了解商品的优缺点和性能&#xff0c;从而做出更明智的购买决策。 1688网站是中国最大的B2B电子商务网站之一&…

RK3566调试EC20

参考博客&#xff1a;RK3568开发笔记-buildroot移远EC20模块调试记录 一、内核配置 cd 到kernel目录&#xff0c;执行make ARCHarm64 menuconfig&#xff0c; Device Drivers >USB support > USB Serial Converter support 选中 USB driver for GSM and CDMA modems选…

04.hadoop上课笔记之java编程和hbase

1.win查看服务 netstat -an #linux也有#R数学建模语言 SCALAR 2.java连接注意事项,代码要设置用户 System.setProperty("HADOOP_USER_NAME", "hadoop");3.伪分布式的好处(不用管分布式细节,直接连接一台机器…,适合用于学习) 4.官方文档 查看类(static |…

5个UI设计师必备的Figma汉化插件

即时设计插件广场提供了许多有用的 UI 插件&#xff0c;帮助优化产品设计过程。其中&#xff0c;产品组件库 Figma 汉化插件对常用的 PC 端和移动端组件进行了筛选&#xff0c;使其更加聚焦和精简。PC 端组件包括基础、按钮、菜单和其他元素&#xff0c;移动端组件包括基础、按…

电子阅读器calibre的使用技巧

十条calibre使用技巧&#xff1a; 1. 添加电子书&#xff1a;可以单独添加文件、添加文件夹、添加zipped书籍&#xff0c;或者通过网络链接直接添加。 2. 转换电子书格式&#xff1a;可以将电子书转换为不同的格式&#xff0c;如AZW3、EPUB、MOBI、PDF等。 3. 修改元数据&am…

文件夹加密超级大师的金钻加密和闪电加密有什么区别?

作为一款专业的文件夹加密软件&#xff0c;文件夹加密超级大师提供了5种文件加密类型&#xff0c;其中金钻加密和闪电加密在加密后效果看似差不多&#xff0c;那么它们有什么区别呢&#xff1f;下面我们就来了解一下吧。 闪电加密更快速 当我们想要加密那些超级庞大的文件夹时…