# 热更新Class **Repository Path**: magiccode/hot.update ## Basic Information - **Project Name**: 热更新Class - **Description**: 使用instrument redefineClasses实现热更新class文件 - **Primary Language**: Java - **License**: AFL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2021-05-18 - **Last Updated**: 2021-05-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JVM CLASS 热加载 ## 介绍 通过instrument redefineClasses 实现对类重新定义 此方法用于替代类的定义,而不引用现有的类文件字节,这与 fix-and-continue 调试过程中重新编译源代码时所做的一样。需要转换现有类文件字节的地方(例如,字节码检测中)应该使用 retransformclasses。 此方法在一个集合上操作,以便允许同时对多个类进行相互依赖的更改(重定义类 a 要求重定义类 b)。 如果重定义的方法有活动的堆栈帧,那么这些活动的帧将继续运行原方法的字节码。将在新的调用上使用此重定义的方法。 此方法不会引起任何初始化操作,jvm 惯例语义下发生的初始化除外。换句话说,重定义一个类不会引起其初始化方法的运行。静态变量的 值将与调用之前的值一样。 重定义类的实例不受影响。 重定义可能会更改方法体、常量池和属性。重定义不得添加、移除、重命名字段或方法;不得更改方法签名、继承关系。在以后的版本中,可能会取消这些限制。在应用转换之前,类文件字节不会被检查、验证和安装。如果结果字节错误,此方法将抛出异常。 如果此方法抛出异常,则不会重定义任何类。 ### HotLoadAgent.jar 加载目标class文件,并重新定义 JVM内的类 1.包:com.zhou.hot.agent 主要类: com.zhou.hot.agent.HotLoadAgent 2. 配置文件:hotload.properties, a).此文件需要放到目标应用根目录或者resources子目录hot下,代码默认配置:hot/hotload.properties b).可配置CLASS文件位置、文件和包路径配置文件、更新文件备份 3. 使用SLF日志,日志名:hot.load,目标应用需要支持SLF4J jar 4. MANIFEST.MF 增加: Agent-Class: com.zhou.hot.agent.HotLoadAgent Can-Redefine-Classes: true Can-Retransform-Classes: true 5.JDK8版本开发 ### HOTUPDATE 负责调用目标应用和HotLoadAgent.jar 1.包:com.zhou.hot.update 主要类: com.zhou.hot.agent.HotUpdate 2. 配置文件:hotupdate.properties, a).此文件需要放到目标应用根目录或者resources子目录hot下,代码默认配置:hot/hotupdate.properties b).配置HotLoadAgent.jar文件路径 3.使用 JDK/lib/tools.jar,VirtualMachine 4. 如何使用 a).自带main方法,可以输入本地java 进程ID b).可build成jar,目标应用可以应用,使用hotLocalSelf方法热更新