CN115576560A - 一种动态类加载器的热重载方法、装置、设备和介质 - Google Patents
一种动态类加载器的热重载方法、装置、设备和介质 Download PDFInfo
- Publication number
- CN115576560A CN115576560A CN202211155171.2A CN202211155171A CN115576560A CN 115576560 A CN115576560 A CN 115576560A CN 202211155171 A CN202211155171 A CN 202211155171A CN 115576560 A CN115576560 A CN 115576560A
- Authority
- CN
- China
- Prior art keywords
- class
- version
- dynamic
- loader
- static variable
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供一种动态类加载器的热重载方法、装置、设备和介质,方法包括:通过动态类加载器加载编译产生的第N版本的类Class文件,类被加载到JVM中,其类全名与Class对象引用的映射关系保存到Class信息存储器中;程序在运行过程中,通过业务逻辑对Class信息存储器中类的静态变量的值进行更新;当类源码在线上环境被修改,经动态编译后生成第N+1版本的类Class文件时,动态类加载器收到通知而进行加载第N+1版本的类Class文件,根据类全名从Class信息存储器中获取第N版本的Class对象,并进行解析得到静态变量的当前值并赋值给第N+1版本Class对象的静态变量。本发明在使用新的ClassLoader进行类加载的时候,同时能恢复static属性值,避免了因static属性值与实际不符而出错。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种动态类加载器的热重载方法、装置、设备和介质。
背景技术
动态类加载器是Java运行时环境的一部分,负责动态加载Java类到Java虚拟机的内存空间中。热重载是指,在不中断程序正常运行的情况下,动态注入修改后的代码片段。
在使用动态类加载器实现Java代码修改后热部署的场景下,开发人员在系统的线上环境进行Java代码修改,修改完成后使用动态编译技术进行代码编译并生成Class字节码文件,编译完成后,系统将创建一个新的自定义ClassLoader实例对编译后的Class字节码文件进行重新加载,以实现线上环境的Class字节码变更后的热重载。
但是根据目前的技术,在重新加载后,Class类由新的ClassLoader实例加载,此Class对象的static属性会进行初始化,从而导致原来的static属性值无法保留下来,例如在某一场景下,开发人员在线上环境开发了如下代码:
Foo的doTask方法被调用5次后,var=5,如果开发人员调整了业务逻辑代码,动态编译后,那么新的动态类加载器实例重新加载Foo字节码文件,var=0,那么业务的数据状态无法保持,从而出错。
发明内容
本发明要解决的技术问题,在于提供一种动态类加载器的热重载方法、装置、设备和介质,在动态类加载器的热重载新版本的类Class文件时,同时能恢复至旧版本的static属性值,避免了因static属性值与实际不符而出错。
第一方面,本发明提供了一种动态类加载器的热重载方法,包括下述步骤:
通过动态类加载器加载编译产生的第N版本的类Class文件,类被加载到JVM中,此时类的静态变量的值被初始化为0,且类全名与Class对象引用的映射关系保存到Class信息存储器中;
程序在运行过程中,通过业务逻辑对Class信息存储器中类的静态变量的值进行更新;
当类源码在线上环境被修改,经动态编译后生成第N+1版本的类Class文件时,动态类加载器收到类发生变更的通知,则进行加载编译产生的第N+1版本的类Class文件,此时第N+1版本的类的静态变量的值被初始化为0;
根据类全名从Class信息存储器中获取第N版本的Class对象,并进行解析得到静态变量的当前值,将解析出来的当前值赋值给第N+1版本Class对象的静态变量。
第二方面,本发明提供了一种动态类加载器的热重载装置,应用于动态类加载器,并包括:
动态加载模块,用于每编译产生一个版本的类Class文件时,将该版本的类Class文件动态加载到JVM中,并将类的静态变量的值初始化为0;
保存模块,用于将类全名与Class对象引用的映射关系保存到Class信息存储器中;
更新模块,用于在程序运行的过程中,通过业务逻辑对Class信息存储器中类的静态变量的值进行更新;
获取模块,用于在动态加载第N+1版本的类Class文件时,根据第N+1版本的类全名通过所述映射关系,从Class信息存储器中获取第N版本的Class对象;
解析模块,用于对获取到的第N版本的Class对象进行解析得到静态变量的当前值;
赋值模块,用于将解析出来的当前值赋值给第N+1版本Class对象的静态变量。
第三方面,本发明提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面所述的方法。
第四方面,本发明提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面所述的方法。
本发明实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:本发明预先将类全名与Class对象引用的映射关系保存到Class信息存储器中,并在程序在运行阶段通过业务逻辑对Class信息存储器中类的静态变量的值进行更新;当动态类加载器收到类发生变更的通知,则进行加载编译产生的新版本的类Class文件,根据类全名从Class信息存储器中获取旧版本的Class对象,并进行解析得到静态变量的当前值,将解析出来的当前值赋值给新版本Class对象的静态变量,从而能在热重载的同时能恢复static属性值,避免了出错。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
下面参照附图结合实施例对本发明作进一步的说明。
图1为本发明实施例的原理图;
图2为本发明实施例一中方法中的流程图;
图3为本发明一具体实施例的流程图;
图4为本发明实施例二中装置的结构示意图;
图5为本发明实施例三中电子设备的结构示意图;
图6为本发明实施例四中介质的结构示意图。
具体实施方式
本申请实施例通过提供一种动态类加载器的热重载方法、装置、设备和介质,在动态类加载器的热重载新版本的类Class文件时,同时能恢复至旧版本的static属性值,避免了因static属性值与实际不符而出错。
本申请实施例中的技术方案,总体思路如下:由于动态类加载器在热重载新版本的类Class文件时会将static属性值初始化为0,导致static属性值与实际情况不符;为解决这一问题,本发明预先将类全名与Class对象引用的映射关系保存到Class信息存储器中,并在程序在运行阶段通过业务逻辑对Class信息存储器中类的静态变量的值进行更新;当动态类加载器收到类发生变更的通知,则进行加载编译产生的新版本的类Class文件,根据类全名从Class信息存储器中获取旧版本的Class对象,并进行解析得到静态变量的当前值,将解析出来的当前值赋值给新版本Class对象的静态变量,从而能在热重载的同时能恢复static属性值,避免了出错。
其原理如图1所示,动态类加载器加载动态编译产生新的Class文件,在内存中生成对应旧的Class对象,根据当前加载的Class的类全名,从Class信息存储器中获取对应的Class对象;使用reflect反射技术解析获取到的Class对象,从中解析出所有的static静态属性值并赋值给新的Class对象(仅赋值同名同类型的静态属性),将新的Class对象保存到Class信息存储器中,替换掉原来的Class对象。
实施例一
如图1所示,本实施例提供一种动态类加载器的热重载方法,该方法应用于动态类加载器,包括下述步骤:
一种动态类加载器的热重载方法,包括下述步骤:
通过动态类加载器加载编译产生的第N版本的类Class文件,类被加载到JVM中,此时类的静态变量的值被初始化为0,且类全名与Class对象引用的映射关系保存到Class信息存储器中;
程序在运行过程中,通过业务逻辑对Class信息存储器中类的静态变量的值进行更新;
当类源码在线上环境被修改,经动态编译后生成第N+1版本的类Class文件时,动态类加载器收到类发生变更的通知,则进行加载编译产生的第N+1版本的类Class文件,此时第N+1版本的类的静态变量的值被初始化为0;
根据类全名从Class信息存储器中获取第N版本的Class对象,并进行解析得到静态变量的当前值,将解析出来的当前值赋值给第N+1版本Class对象的静态变量。
所述动态类加载器是采用reflect反射技术对所述第N版本的Class对象进行解析。
仍以背景技术中的场景为例,如图3所示,本发明方法具体过程如下:
类加载器加载编译产生的1.0版本的Foo.class文件;
Foo类被加载到JVM(Java虚拟机)中,此时Foo的静态变量var被初始化为值:0;
将Foo类全名与Foo的Class对象引用的映射关系保存到Class信息存储器中;
程序在运行过程中,业务逻辑对var的值进行变更,var=5;
开发人员在线上环境对Foo类源码进行修改,程序会动态编译,并生成新的2.0版本的Foo.class文件,同时通知类加载器,Foo类发生了变更;
类加载器接收到Foo类的变更通知;
类加载器重新加载新的2.0版本的Foo.class文件;
Foo被重新加载到JVM中,此时Foo的静态变量var依然会被初始化为值:0;
根据Foo类全名从Class信息存储器中获取1.0版本的Foo Class对象;
使用reflect反射技术从Class对象中解析出静态变量var的当前值;
将解析出来的当前值赋值给2.0版本Foo Class对象的静态变量var,此时var=5(仅支持赋值同名同类型的静态变量);
动态类加载器将2.0版本的Foo Class对象保存到Class信息存储器中,替换掉原来的1.0版本的Foo Class对象.。
上述过程中,在1.0版本下,Foo的doTask方法被调用5次后,var=5,开发人员调整了业务逻辑代码,生成新的2.0版本的Foo.class文件,在类加载器重新加载2.0版本的Foo字节码文件,会初始化var=0,此时动态类加载器根据类全名从Class信息存储器中获取旧版本的Class对象,并进行解析得到静态变量的当前值,将解析出来的当前值赋值给新版本Class对象的静态变量,即var=5,从而保持了原业务的数据状态。
基于同一发明构思,本申请还提供了与实施例一中的方法对应的装置,详见实施例二。
实施例二
如图4所示,在本实施例中提供了一种动态类加载器的热重载装置,应用于动态类加载器,并包括:
动态加载模块,用于每编译产生一个版本的类Class文件时,将该版本的类Class文件动态加载到JVM中,并将类的静态变量的值初始化为0;
保存模块,用于将类全名与Class对象引用的映射关系保存到Class信息存储器中;
更新模块,用于在程序运行的过程中,通过业务逻辑对Class信息存储器中类的静态变量的值进行更新;
获取模块,用于在动态加载第N+1版本的类Class文件时,根据第N+1版本的类全名通过所述映射关系,从Class信息存储器中获取第N版本的Class对象;
解析模块,用于对获取到的第N版本的Class对象进行解析得到静态变量的当前值;
赋值模块,用于将解析出来的当前值赋值给第N+1版本Class对象的静态变量。
所述解析模块是采用reflect反射技术对所述第N版本的Class对象进行解析的。
由于本发明实施例二所介绍的装置,为实施本发明实施例一的方法所采用的装置,故而基于本发明实施例一所介绍的方法,本领域所属人员能够了解该装置的具体结构及变形,故而在此不再赘述。凡是本发明实施例一的方法所采用的装置都属于本发明所欲保护的范围。
基于同一发明构思,本申请提供了实施例一对应的电子设备实施例,详见实施例三。
实施例三
本实施例提供了一种电子设备,如图5所示,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时,可以实现实施例一中任一实施方式。
由于本实施例所介绍的电子设备为实施本申请实施例一中方法所采用的设备,故而基于本申请实施例一中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本申请实施例中的方法不再详细介绍。只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。
基于同一发明构思,本申请提供了实施例一对应的存储介质,详见实施例四。
实施例四
本实施例提供一种计算机可读存储介质,如图6所示,其上存储有计算机程序,该计算机程序被处理器执行时,可以实现实施例一中任一实施方式。
本申请实施例中提供的技术方案,至少具有如下技术效果或优点:本发明动态类加载器的热重载方法、装置、设备和介质,在使用新的ClassLoader进行类加载的时候,通过解析原Class对象得到原有的static属性值再赋值给新的Class对象,以在热重载的同时能恢复static属性值,无需另行专门修改,从而提高了开发人员的工作效率。
本领域内的技术人员应明白,本发明的实施例可提供为方法、装置或系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。
Claims (6)
1.一种动态类加载器的热重载方法,其特征在于:包括:
通过动态类加载器加载编译产生的第N版本的类Class文件,类被加载到JVM中,此时类的静态变量的值被初始化为0,且类全名与Class对象引用的映射关系保存到Class信息存储器中;
程序在运行过程中,通过业务逻辑对Class信息存储器中类的静态变量的值进行更新;
当类源码在线上环境被修改,经动态编译后生成第N+1版本的类Class文件时,动态类加载器收到类发生变更的通知,则进行加载编译产生的第N+1版本的类Class文件,此时第N+1版本的类的静态变量的值被初始化为0;
根据类全名从Class信息存储器中获取第N版本的Class对象,并进行解析得到静态变量的当前值,将解析出来的当前值赋值给第N+1版本Class对象的静态变量。
2.根据权利要求1所述的一种动态类加载器的热重载方法,其特征在于:所述动态类加载器是采用reflect反射技术对所述第N版本的Class对象进行解析。
3.一种动态类加载器的热重载装置,其特征在于:应用于动态类加载器,并包括:
动态加载模块,用于每编译产生一个版本的类Class文件时,将该版本的类Class文件动态加载到JVM中,并将类的静态变量的值初始化为0;
保存模块,用于将类全名与Class对象引用的映射关系保存到Class信息存储器中;
更新模块,用于在程序运行的过程中,通过业务逻辑对Class信息存储器中类的静态变量的值进行更新;
获取模块,用于在动态加载第N+1版本的类Class文件时,根据第N+1版本的类全名通过所述映射关系,从Class信息存储器中获取第N版本的Class对象;
解析模块,用于对获取到的第N版本的Class对象进行解析得到静态变量的当前值;
赋值模块,用于将解析出来的当前值赋值给第N+1版本Class对象的静态变量。
4.根据权利要求3所述的一种动态类加载器的热重载装置,其特征在于:所述解析模块是采用reflect反射技术对所述第N版本的Class对象进行解析的。
5.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1或2所述的方法。
6.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1或2所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211155171.2A CN115576560A (zh) | 2022-09-22 | 2022-09-22 | 一种动态类加载器的热重载方法、装置、设备和介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211155171.2A CN115576560A (zh) | 2022-09-22 | 2022-09-22 | 一种动态类加载器的热重载方法、装置、设备和介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115576560A true CN115576560A (zh) | 2023-01-06 |
Family
ID=84581219
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211155171.2A Pending CN115576560A (zh) | 2022-09-22 | 2022-09-22 | 一种动态类加载器的热重载方法、装置、设备和介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115576560A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116974653A (zh) * | 2023-09-21 | 2023-10-31 | 阿里云计算有限公司 | 类加载方法及系统 |
-
2022
- 2022-09-22 CN CN202211155171.2A patent/CN115576560A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116974653A (zh) * | 2023-09-21 | 2023-10-31 | 阿里云计算有限公司 | 类加载方法及系统 |
CN116974653B (zh) * | 2023-09-21 | 2024-01-09 | 阿里云计算有限公司 | 类加载方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10795660B1 (en) | Live code updates | |
JP7090657B2 (ja) | アプリケーションをアップグレードするための方法、装置、デバイスならびに記憶媒体 | |
CN109491695B (zh) | 一种集成安卓应用的增量更新方法 | |
CN106775723B (zh) | 基于Android平台的系统固件定制的方法和Android设备 | |
US6003095A (en) | Apparatus and method for demand loading a dynamic link library | |
JP6198939B2 (ja) | ドライバをロードする方法及び組み込みデバイス | |
CN107168749B (zh) | 一种编译方法、装置、设备和计算机可读存储介质 | |
US20030126310A1 (en) | Algorithm for localization of a JAVA application using reflection API and a custom class loader | |
CN108319460B (zh) | 应用程序安装包的生成方法、装置、电子设备及存储介质 | |
CN110955431B (zh) | 编译环境的处理方法及装置 | |
JP2017516210A (ja) | 動的に生成されたパターンベースクラスの構造識別 | |
CN110059456B (zh) | 代码保护方法、代码保护装置、存储介质与电子设备 | |
WO2019079080A1 (en) | USE OF SEMANTIC ANNOTATIONS TO ORDER COMPATIBILITY BEHAVIORS | |
CN112882718B (zh) | 编译处理方法、装置、设备及存储介质 | |
CN112764753A (zh) | 一种项目的部署方法、装置、电子设备及存储介质 | |
US11880674B2 (en) | Adaptive hot reload for class changes | |
CA2402298A1 (en) | System and method for preloading classes in a data processing device that does not have a virtual memory manager | |
CN115576560A (zh) | 一种动态类加载器的热重载方法、装置、设备和介质 | |
CN111367512B (zh) | 一种应用程序开发中创建Android库模块依赖关系的方法及装置 | |
CN113010180A (zh) | 一种固件生成方法、系统、设备以及介质 | |
CN108228266B (zh) | 一种Android插件框架下不同插件间启动Fragment组件的方法和装置 | |
CN113032104A (zh) | 一种部署k8s容器应用的方法和装置 | |
CN111367796A (zh) | 应用程序调试方法及装置 | |
CN116243971B (zh) | 一种基于静态依赖自举的内核无关的模块构建方法 | |
US20240012624A1 (en) | Non-transitory computer-readable storage medium with executable development program stored thereon, information processing system, information processing apparatus, and information processing method |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |