原理很简单,就是使用ClassLoader加载新的类,替换掉旧的对象。
注意最好使用接口,我们只是加载实现类,接口类一直使用旧的ClassLoader,这样就不会存在类型转换的报错。
具体的代码也可以参考我的github:https://github.com/huangyunbin/hot/tree/master
public class DynamicClassLoader extends ClassLoader {
public Class<?> findClass(byte[] b) throws ClassNotFoundException {
return defineClass(null, b, 0, b.length);
}
}
public interface Target {
String name();
}
public class TargetImpl implements Target {
public String name() {
return "测试1";
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class Main {
static Target obj = new TargetImpl();
public static void main(String[] args) throws Exception {
while (true) {
String path = "/Users/bin/Documents/workspace/hot/target/classes/com/eyu/hot/TargetImpl.class";
byte[] b = getBytes(path);
Class c = new DynamicClassLoader().findClass(b);
obj = (Target) c.newInstance();
System.err.println(obj.name());
TimeUnit.SECONDS.sleep(2);
}
}
// 从本地读取文件
private static byte[] getBytes(String filename) throws IOException {
File file = new File(filename);
long len = file.length();
byte raw[] = new byte[(int) len];
FileInputStream fin = new FileInputStream(file);
fin.read(raw);
fin.close();
return raw;
}
}
分享到:
相关推荐
java服务端热更新案例-javaagent
java实现class的热替换
让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的...Java实现热加载; Java动态加载class; Java覆盖已加载的class; Java自定义classloader;
使用Java实现实时热修复
实现Java热部署的几种解决方案.docx
springboot 、java类热加载、jarinjar、动态编译、自动引用依赖
Java 自定义ClassLoader 实现类的热替换核心代码
java 的类动态加载实现,入口在MsgHandler 通过修改MyManager类中的输出值可用动态编译对应的class,然后替换后查看效果。
在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。对于某些大型的应用来说,每次的...
Java语言-动态编译代码并热加载类,js热加载
leetcode热题100java实现代码
美团IDEA插件实现Java应用的热部署实践
实现对代码的动态更新,只需要上传覆盖原class文件即可在不停止项目的过程中更新代码
这篇文章就来介绍一下Android中实现热更新的原理。 一、ClassLoader 我们知道Java在运行时加载对应的类是通过ClassLoader来实现的,ClassLoader本身是一个抽象来,Android中使用PathClassLoader类作为Android的默认...
今天分享一个非常重要的命令 redefine ,主要作用是加载外部的 .class 文件,用来替换 JVM 已经加载的类,总结起来就是实现了 Java 的热更新,感兴趣的朋友跟随小编一起看看吧
本地debug的时候,可以实时编译并更新代码,线上也可以不停服来动态更新类,即所说的java热部署。 JDK代理的两种方式: 1.premain方式是Java SE5开始提供的代理方式,但其必须在命令行指定代理jar,并且代理类...
Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入...持续学习与探索:Java语言和游戏开发技术都在不断更新,建议你在实践中持续学习新的技术和工具,不
隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用。...该资源通过java模拟实现了隐马尔科夫模型算法,非常有用
小弟用java写的一个桌面应用程序,可以读取百度新闻热搜词的前10条,呵呵,大家支持下啦
基于java实现的IM即时通信模块源码+项目说明.zip 基于java实现的IM即时通信模块,尽量避免使用框架工具,以便移植(主要是希望安卓端也能用,或者其他能运行java虚拟机的嵌入式设备) 这是毕业设计的部分代码,写得...