java动态替换class_透过现象看本质:Java类动态加载和热替换

本文探讨了Java类加载器的双亲委派模型,详细介绍了类的加载、卸载条件,以及如何通过自定义类加载器实现类的动态加载和卸载。通过示例展示了如何实现Java类的热替换,强调了在特定场景下动态卸载的限制。文章还提到了在实际项目中应用类加载机制的场景。
摘要由CSDN通过智能技术生成

原标题:透过现象看本质:Java类动态加载和热替换

作者:maijun

来自:华为云开发者社区

摘要:本文主要介绍类加载器、自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换。

最近,遇到了两个和Java类的加载和卸载相关的问题:

1) 是一道关于Java的判断题:一个类被首次加载后,会长期留驻JVM,直到JVM退出。这个说法,是不是正确的?

2) 在开发的一个集成平台中,需要集成类似接口的多种工具,并且工具可能会有新增,同时在不同的环境部署会有裁剪(例如对外提供服务的应用,不能提供特定的采购的工具),如何才能更好地实现?

针对上面的第2点,我们采用Java插件化开发实现。上面的两个问题,都和Java的类加载和热替换机制有关。

1. Java的类加载器和双亲委派模型 1.1 Java类加载器

类加载器,顾名思义,就是用来实现类的加载操作。每个类加载器都有一个独立的类名称空间,就是说每个由该类加载器加载的类,都在自己的类名称空间, 如果要比较两个类是否“相等”,首先这两个类必须在相同的类命名空间,即由相同的类加载器加载(即对于任何一个类,都必须由该类本身和加载它的类加载器一起确定其在JVM中的唯一性),不是同一个类加载器加载的类,不会相等。

在Java中,主要有如下的类加载器:

4c8d3fd6bf8d14e3680712c99e7bb422.png

图1.1 Java类加载器

下面,简单介绍上面这几种类加载器:

启动类加载器(Bootstrap Class Loader): 这个类使用C++开发(所有的类加载器中,唯一使用C++开发的类加载器),用来加载/lib目录中jar和tools.jar或者使用 -Xbootclasspath 参数指定的类。

扩展类加载器(Extension Class Loader): 定义为misc.Launcher$ExtClassLoader,用来加载/lib/ext目录或者使用java.ext.dir指定的类。

应用程序类加载器(Application Class Loader): 定义为misc.Launcher$AppClassLoader,用来加载用户类路径下面(classpath)下面所有的类,一般情况下,该类是应用程序默认的类加载器。

用户自定义类加载器(User Class Loader): 用户自定义类加载器,一般没有必要,后面我们会专门来一部分介绍该类型的类加载器。1.2 双亲委派模型

双亲委派模型,是从 Java1.2 开始引入的一种类加载器模式,在Java中,类的加载操作通过java.lang.ClassLoader中的loadClass方法完成,咱们首先看看该方法的实现(直接从Java源码中捞出来的):

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值