`

java实现热更新

 
阅读更多
原理很简单,就是使用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;
	}

}
2
2
分享到:
评论

相关推荐

    java项目实现热更源码-javaagent

    本文将深入探讨如何利用Java Agent实现热更新,以及涉及的关键概念和技术。 Java Agent是Java提供的一种机制,允许在JVM加载类之前或之后对类进行拦截和修改。它主要通过`premain`和`agentmain`方法来实现,这两个...

    java类重载,可以用于热更新

    但是,需要注意的是,热更新并非总是可行的,有些复杂的情况,如静态变量、内部类或者涉及到多线程的场景,可能需要更复杂的处理或无法实现热更新。 在给定的`reloadTest`压缩包中,可能包含了一些关于如何进行类...

    java简单热替换

    在实际开发中,开发者通常会借助IDE提供的功能来实现热替换。例如,Eclipse的Dynamic Hot Code Replace和IntelliJ IDEA的Live Edit都是这方面的例子。这些工具通过与JVM通信,可以在不破坏应用状态的情况下,将修改...

    java实现class的热替换

    java实现class的热替换

    springboot+java类热加载

    我们可以通过自定义类加载器来实现热加载。例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**是一种打包技术,它可以将多个JAR文件打包成一个大的...

    Java语言-动态编译代码并热加载类

    然而,这里标签中提到的"js热加载"可能是指JavaScript与Java的交互,比如使用JavaScript引擎如Nashorn(Java 8)或GraalVM在Java应用中执行JavaScript代码,并实现在运行时更新JavaScript逻辑。尽管Nashorn在Java 15...

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的...Java实现热加载; Java动态加载class; Java覆盖已加载的class; Java自定义classloader;

    支持Java热部署的插件

    2. 类重定义:当发现修改的类时,插件会使用JVM的`instrumentation` API来替换内存中的类实例,实现类的热更新。 3. 事务处理:为了保证代码的正确性,热部署插件需要处理好事务边界,确保在部署过程中不会破坏正在...

    Java之——类热加载

    自定义类加载器可以继承`java.lang.ClassLoader`,并覆盖`loadClass()`方法来实现热加载功能。 3. MsgHandler与MyManager 在描述中提到的`MsgHandler`可能是热加载的入口,它可能负责监听或触发类的热加载操作。而...

    使用arthas命令redefine实现Java热更新(推荐)

    这可以实现热更新的目的,而不需要手动上传 .class 文件到服务器。 知识点四: Java 热更新的实现 使用 redefine 命令可以实现 Java 的热更新。例如,在上面的示例代码中,我们使用 redefine 命令更新了 Fun 类的 ...

    实现Java热部署的几种解决方案.docx

    Java 热部署是指在不停止应用程序的情况下,动态地更新和替换应用程序中的类、方法或资源。这种技术可以提高开发效率、缩短开发周期、降低维护成本。今天,我们将讨论实现 Java 热部署的几种解决方案。 1. Spring-...

    Java类热替换(热部署)源码

    如果类被修改,JIT可以重新编译新的字节码,实现热替换。 3. **Java代理(Java Agents)**:Java提供了一个名为`java.lang.instrument`的API,允许我们在类加载到JVM之前对其进行修改。通过这种方式,我们可以动态...

    实现tomcat热更新class文件.docx

    为了解决这个问题,可以配置Tomcat实现热更新class文件,使得修改后的Java类在不重启服务器的情况下就能立即生效。下面将详细介绍如何实现这一功能。 首先,我们需要理解Tomcat的工作原理。当一个Web应用被部署到...

    藏经阁-美团Robust热更新产品化之路 (1).pdf

    * 使用Java和Native代码来实现热更新。 * 使用DexClassLoader来加载补丁DEX文件。 4. Robust热更新的优点 Robust热更新的优点包括: * 可以实时更新应用程序,提高用户体验。 * 可以减少应用程序的更新成本。 * ...

    java应用程序自动更新

    10. **热更新**:在某些情况下,应用可能支持热更新,即无需关闭应用即可完成更新。这通常需要特定的设计和技术,如模块化架构和动态加载。 11. **更新日志**:提供清晰的更新日志,让用户知道新版本带来了哪些改进...

    java热加载Class文件

    3. **代理模式**:使用Java的代理机制,可以在运行时创建新类的代理,从而实现热加载。例如,CGLIB和ASM库可以用来创建字节码代理,使得调用更新的类代码变得可能。 4. **类文件替换**:在热加载时,需要确保新版本...

    java热部署工具

    1. **JRebel**: JRebel是一款商业的Java热部署工具,它可以直接在JVM中实现类的热更新,而无需重启服务器。开发者只需要在IDE中配置JRebel插件,并将项目指向JRebel代理的类加载器,就可以实时看到代码更改的效果。 ...

    Bugly实现热更新Demo

    本教程将详细讲解如何使用Bugly这一知名的移动应用错误监控与热更新平台来实现热更新功能。Bugly是由腾讯提供的一款专业服务,它集成了错误上报、性能监控以及热修复等多种功能。 首先,我们需要注册并登录Bugly...

    利用FTP服务器来实现Java部署程序的自动更新

    5. **应用热更新**:下载完成后,Java程序需要正确地替换或升级本地文件,同时保持应用程序的运行状态。一种常见的方式是使用类加载器的策略,比如双版本类加载,使得新的类库能够在不影响旧版本应用执行的情况下...

    es 同义词 热更新 1.1版本

    `HeatSynonymFilter`可能就是实现热更新同义词的核心部分,它可以动态加载或更新同义词库。 3. `HeatSynonymTokenFilterFactory.java` - 这可能是创建`HeatSynonymFilter`实例的工厂类。在Java中,工厂类通常用于...

Global site tag (gtag.js) - Google Analytics