Java ClassLoader虚拟类实现代码热替换的示例代码

作者:lolxxs 时间:2022-06-25 03:08:52 

改进思考

  • 正常实现流程应该为继承ClassLoader虚拟类,并重写其loadClass方法和findClass方法,并在loadClass方法中调用findClass方法,在findClass方法中再调用defineClass方法

  • 实现热替换应该是替换修改过的代码,则应当维护一个Map<String, Long> 存储从全限定类名到上次文件修改时间的映射,每次定时扫描Class文件目录或检测到保存快捷键Ctrl+s时触发扫描,文件的属性也有上次修改时间,拿我们存储的和文件的属性比较即可知道文件是否修改,即是否需要重新加载Class类

  • 热替换产生了大量类信息都存储在jdk1.7的永久代,jdk1.8的元空间,如果无用的类信息过多则会造成OOM,我们自定义类加载器和其产生的Class类对象,都可以通过置空(= null)使其不可达,然后调用System.gc()就可以卸载,即类似如下代码

public class Test extends ClassLoader {
  public static void main(String[] args) throws Exception {
    MyClassLoader classLoader = new MyClassLoader();
 Class classLoaded = classLoader.loadClass("MyClass");
  classLoaded = null;
 classLoader = null;
  System.gc();  
 }
}

来源:https://blog.csdn.net/weixin_45754452/article/details/125231615

标签:Java,ClassLoader,热替换
0
投稿

猜你喜欢

  • Java生成二维码可添加logo和文字功能

    2021-06-23 22:24:35
  • Java移动文件夹及其所有子文件与子文件夹

    2023-08-01 09:53:38
  • 带你重新认识MyBatis的foreach

    2023-11-21 08:44:54
  • C#实现农历日历的方法

    2022-08-17 21:27:29
  • Spring+Vue整合UEditor富文本实现图片附件上传的方法

    2022-09-27 10:36:13
  • 详解Spring中使用@within与@target的区别

    2022-11-18 17:58:24
  • C#面向对象编程之猜拳游戏实现方法

    2021-11-17 23:25:52
  • Java二分查找算法实现代码实例

    2023-08-24 05:34:23
  • Android应用创建桌面快捷方式代码

    2022-03-03 00:51:44
  • 第三方包jintellitype实现Java设置全局热键

    2023-09-25 10:33:50
  • Android自定义listview布局实现上拉加载下拉刷新功能

    2023-05-12 23:27:28
  • 在IDEA中安装MyBatis Log Plugin插件,执行mybatis的sql语句(推荐)

    2022-02-17 08:04:43
  • C#泛型的逆变协变之个人理解

    2021-05-28 16:33:03
  • java 可变参数详解及实例

    2021-06-01 10:02:42
  • 解决IDEA maven 项目修改代码不生效,mvn clean、install后才生效

    2022-06-19 12:17:06
  • Android开发中解析xml文件XmlUtils工具类与用法示例

    2023-03-26 01:05:45
  • Maven工程pom中如何定义jdk版本

    2022-02-18 08:16:13
  • Java中避免NullPointerException的方法总结

    2021-08-29 08:09:24
  • Java byte数组操纵方式代码实例解析

    2022-02-18 16:54:12
  • Servlet3.0学习总结之基于Servlet3.0的文件上传实例

    2023-09-02 01:51:33
  • asp之家 软件编程 m.aspxhome.com