CN117193874A - 插件处理方法、装置、存储介质及电子设备 - Google Patents
插件处理方法、装置、存储介质及电子设备 Download PDFInfo
- Publication number
- CN117193874A CN117193874A CN202311140820.6A CN202311140820A CN117193874A CN 117193874 A CN117193874 A CN 117193874A CN 202311140820 A CN202311140820 A CN 202311140820A CN 117193874 A CN117193874 A CN 117193874A
- Authority
- CN
- China
- Prior art keywords
- class
- target
- plug
- original
- plugin
- 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
- 238000003672 processing method Methods 0.000 title abstract description 21
- 230000001419 dependent effect Effects 0.000 claims abstract description 167
- 238000013507 mapping Methods 0.000 claims abstract description 78
- 238000000034 method Methods 0.000 claims abstract description 52
- 238000012545 processing Methods 0.000 claims description 50
- 239000003795 chemical substances by application Substances 0.000 description 24
- 238000004590 computer program Methods 0.000 description 14
- 230000008569 process Effects 0.000 description 13
- 238000010586 diagram Methods 0.000 description 12
- 230000006870 function Effects 0.000 description 12
- 238000004891 communication Methods 0.000 description 10
- 238000012544 monitoring process Methods 0.000 description 10
- 238000005516 engineering process Methods 0.000 description 4
- 230000003993 interaction Effects 0.000 description 4
- 230000003287 optical effect Effects 0.000 description 4
- 238000012217 deletion Methods 0.000 description 3
- 230000037430 deletion Effects 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 3
- 238000013473 artificial intelligence Methods 0.000 description 2
- 235000010627 Phaseolus vulgaris Nutrition 0.000 description 1
- 244000046052 Phaseolus vulgaris Species 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000010267 cellular communication Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000002347 injection Methods 0.000 description 1
- 239000007924 injection Substances 0.000 description 1
- 230000001788 irregular Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000010801 machine learning Methods 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000001953 sensory effect Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Landscapes
- Stored Programmes (AREA)
Abstract
本发明提供一种插件处理方法、装置、存储介质及电子设备,其中,该方法包括:获取目标代理插件,目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类;从至少一个原始类加载器中确定出N个匹配原始类加载器;若M和N均为正整数,则在键映射数据中添加目标插件类加载器标识所指示的目标插件类加载器和各个匹配原始类加载器之间的对应关系;分别将各个目标嵌码类中的嵌码,嵌入至各个匹配原始类加载器中的相应原始嵌码类中,并生成目标插件类加载器,目标插件类加载器在M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。本发明实施例可实现目标代理插件的动态加载,以使目标代理插件支持被动态卸载。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种插件处理方法、装置、存储介质及电子设备。
背景技术
目前,Java Agent(一种Java虚拟机(JVM,Java Virtual Machine)提供的机制)技术已广泛应用于各种场景,如各种类型的代码注入、性能监控、日志记录以及AOP(AspectOriented Programming,面向切面编程)等,所谓的Java是一种面向对象的编程语言;其中,Java Agent用于允许在应用程序启动时,通过代理方式来修改或增强应用程序的字节码。相应的,Java Agent插件(即代理插件,也可简称为插件)是一种通过Java Agent技术在应用程序中添加额外功能的扩展模块,这些插件通常用于应用程序的监控、性能优化、分布式追踪等方面,可以帮助开发人员实时了解应用程序的运行状态以及各个组件之间的交互情况等。但现有技术通常将代理插件中的插件依赖工具类(即util类,用于提供一些实用方法和数据结构的类)打入到相应的原始类加载器(classloader)中,或打入到引导类加载器(BootstrapClassLoader)中,以实现对插件依赖工具类的加载,导致应用程序运行过程中,插件依赖工具类所属的类加载器中始终存在被引用的类,而类加载器必须在包括的所有类均没有被引用时才能被回收,从而导致插件依赖工具类所属的类加载器无法被卸载,以使插件依赖工具类无法被卸载,进而导致代理插件无法安全的卸载。基于此,如何加载目标代理插件,以使目标代理插件支持被动态卸载成为一个研究热点。
发明内容
有鉴于此,本发明实施例提供了一种插件处理方法、装置、存储介质及电子设备,以解决现有技术难以在应用程序运行过程中,动态加载及卸载代理插件的问题;也就是说,本发明实施例可在应用程序运行过程中,实现目标代理插件的动态加载,且可使目标插件类加载器支持被动态卸载(即支持在应用程序运行过程中被卸载),以使目标代理插件支持被动态卸载,从而在无需应用程序重启的情况下,实现对代理插件的加载、卸载以及重新加载(即重加载)等。
根据本发明的一方面,提供了一种插件处理方法,所述方法包括:
获取目标代理插件,所述目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类,M为非负整数;其中,一个目标嵌码类包括用于嵌入相应原始嵌码类的嵌码,一个目标插件依赖工具类用于被嵌入相应目标嵌码类中的嵌码后的原始嵌码类所引用;
基于所述至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,一个匹配原始类加载器包括:分别与所述各个目标嵌码类相对应的原始嵌码类,N为非负整数;
若M和N均为正整数,则基于所述目标代理插件对应的目标插件类加载器标识,以及所述N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加所述目标插件类加载器标识所指示的目标插件类加载器和所述各个匹配原始类加载器之间的对应关系,所述目标插件类加载器用于加载所述M个目标插件依赖工具类,且所述键映射数据用于在需加载任一插件依赖工具类时确定相应的插件类加载器;
分别将所述各个目标嵌码类中的嵌码,嵌入至所述各个匹配原始类加载器中的相应原始嵌码类中,并生成所述目标插件类加载器,以实现所述目标代理插件的加载,所述目标插件类加载器在所述M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。
根据本发明的另一方面,提供了一种插件处理装置,所述装置包括:
获取单元,用于获取目标代理插件,所述目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类,M为非负整数;其中,一个目标嵌码类包括用于嵌入相应原始嵌码类的嵌码,一个目标插件依赖工具类用于被嵌入相应目标嵌码类中的嵌码后的原始嵌码类所引用;
处理单元,用于基于所述至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,一个匹配原始类加载器包括:分别与所述各个目标嵌码类相对应的原始嵌码类,N为非负整数;
所述处理单元,还用于若M和N均为正整数,则基于所述目标代理插件对应的目标插件类加载器标识,以及所述N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加所述目标插件类加载器标识所指示的目标插件类加载器和所述各个匹配原始类加载器之间的对应关系,所述目标插件类加载器用于加载所述M个目标插件依赖工具类,且所述键映射数据用于在需加载任一插件依赖工具类时确定相应的插件类加载器;
所述处理单元,还用于分别将所述各个目标嵌码类中的嵌码,嵌入至所述各个匹配原始类加载器中的相应原始嵌码类中,并生成所述目标插件类加载器,以实现所述目标代理插件的加载,所述目标插件类加载器在所述M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。
根据本发明的另一方面,提供了一种电子设备,所述电子设备包括处理器、以及存储程序的存储器,其中,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行上述所提及的方法。
根据本发明的另一方面,提供了一种存储有计算机指令的非瞬时计算机可读存储介质,所述计算机指令用于使计算机执行上述所提及的方法。
本发明实施例可在获取到目标代理插件后,基于至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类;其中,一个目标嵌码类包括用于嵌入相应原始嵌码类的嵌码,一个目标插件依赖工具类用于被嵌入相应目标嵌码类中的嵌码后的原始嵌码类所引用。进一步的,若M和N均为正整数,则可基于目标代理插件对应的目标插件类加载器标识,以及N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加目标插件类加载器标识所指示的目标插件类加载器和各个匹配原始类加载器之间的对应关系,目标插件类加载器用于加载M个目标插件依赖工具类,且键映射数据用于在需加载任一插件依赖工具类时确定相应的插件类加载器;然后,可分别将各个目标嵌码类中的嵌码,嵌入至各个匹配原始类加载器中的相应原始嵌码类中,并生成目标插件类加载器,以实现目标代理插件的加载,目标插件类加载器在M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。可见,本发明实施例可在目标代理插件对应的应用程序的运行过程中,实现对目标代理插件的动态加载,从而使得目标插件类加载器支持被动态卸载,以使M个目标插件依赖工具类支持被动态卸载,进而使得目标代理插件支持被动态卸载,即可支持对目标代理插件的动态卸载等;也就是说,可在无需应用程序重启的情况下,实现对目标代理插件的动态加载和卸载等。
附图说明
在下面结合附图对于示例性实施例的描述中,本发明的更多细节、特征和优点被公开,在附图中:
图1示出了根据本发明示例性实施例的一种插件处理方法的流程示意图;
图2示出了根据本发明示例性实施例的一种扫描插件目录的示意图;
图3a示出了根据本发明示例性实施例的一种键映射数据的示意图;
图3b示出了根据本发明示例性实施例的另一种键映射数据的示意图;
图3c示出了根据本发明示例性实施例的又一种键映射数据的示意图;
图4a示出了根据本发明示例性实施例的一种打入插件依赖工具类的示意图;
图4b示出了根据本发明示例性实施例的一种加载目标插件依赖工具类的示意图;
图5示出了根据本发明示例性实施例的另一种插件处理方法的流程示意图;
图6示出了根据本发明示例性实施例的又一种插件处理方法的流程示意图;
图7示出了根据本发明示例性实施例的一种插件处理装置的示意性框图;
图8示出了能够用于实现本发明的实施例的示例性电子设备的结构框图。
具体实施方式
下面将参照附图更详细地描述本发明的实施例。虽然附图中显示了本发明的某些实施例,然而应当理解的是,本发明可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本发明。应当理解的是,本发明的附图及实施例仅用于示例性作用,并非用于限制本发明的保护范围。
应当理解,本发明的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本发明的范围在此方面不受限制。
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。需要注意,本发明中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
需要注意,本发明中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
本发明实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
需要说明的是,本发明实施例提供的插件处理方法的执行主体可以是一个或多个电子设备,本发明对此不作限定;其中,电子设备可以是终端(即客户端)或者服务器,那么在执行主体包括多个电子设备,且多个电子设备中包括至少一个终端和至少一个服务器时,本发明实施例提供的插件处理方法可由终端和服务器共同执行。相应的,此处所提及的终端可以包括但不限于:智能手机、平板电脑、笔记本电脑、台式计算机、智能手表、智能语音交互设备、智能家电、车载终端、飞行器,等等。此处所提及的服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算(cloud computing)、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(Content Delivery Network,内容分发网络)、以及大数据和人工智能平台等基础云计算服务的云服务器,等等。
基于上述描述,本发明实施例提出一种插件处理方法,该插件处理方法可以由上述所提及的电子设备(终端或服务器)执行;或者,该插件处理方法可由终端和服务器共同执行。为了便于阐述,后续均以电子设备执行该插件处理方法为例进行说明;如图1所示,该插件处理方法可包括以下步骤S101-S104:
S101,获取目标代理插件,目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类,M为非负整数。
其中,一个目标嵌码类包括用于嵌入相应原始嵌码类的嵌码,一个目标插件依赖工具类用于被嵌入相应目标嵌码类中的嵌码后的原始嵌码类所引用;也就是说,任一目标嵌码类可用于使相应嵌入嵌码后的原始嵌码类包括该任一目标嵌码类中的嵌码,且一个目标插件依赖工具类可用于被相应目标嵌码类中的嵌码所引用,即一个目标插件依赖工具可用于被嵌入相应嵌码后的原始嵌码类中的嵌码所引用,即一个目标插件依赖工具类可用于被相应嵌入嵌码后的原始嵌码类中的嵌码所引用。
在本发明实施例中,目标代理插件可以为SkyWalking(一种数据链路追踪插件)、New Relic(一种性能监控插件)、DataDog(一种应用程序监控插件)或OpenTelemetry(一种应用行为和性能观测插件)等,这些Java Agent插件可利用字节码操作技术和JVM提供的Instrumentation(插桩)接口,在应用程序运行时动态地捕获关键信息并进行监控、追踪和分析等;或者,目标代理插件还可以为用户(即开发人员)自定义的代理插件,等等;本发明对此不作限定。在本发明实施例中,也可将代理插件称为插件。
需要说明的是,目标代理插件的获取方式可以包括但不限于以下几种:
第一种获取方式:电子设备中存储有至少一个代理插件,在此种情况下,在检测到至少一个代理插件中存在待加载代理插件时,可将待加载代理插件作为目标代理插件,从而获取到目标代理插件,待加载代理插件可以包括以下任一种:新增代理插件和被更新代理插件对应的更新后的代理插件(如对初始代理插件进行更新后的代理插件)。可选的,电子设备可对插件目录进行扫描,以确定待加载代理插件,并将待加载代理插件作为目标代理插件;其中,被更新代理插件对应的更新后的代理插件通过被更新代理插件确定的,即在检测到被更新代理插件后,可确定被更新代理插件对应的更新后的代理插件,且确定被更新代理插件或新增代理插件的具体实施方式见下述所示,本发明在此不再赘述。可选的,代理插件的更新可以包括但不限于插件代码更新和插件配置更新等。
示例性的,如图2所示,电子设备可通过插件监控线程,间断扫描插件目录,以实现对插件目录中每个代理插件的监控,从而确定目标代理插件。其中,插件目录可包括支持加载的所有代理插件,也就是说,位于插件目录中的代理插件支持被加载。可选的,电子设备可对应用程序运行时的状态进行监控,如对应用程序所涉及的代理插件的加载、更新以及卸载的过程进行监控。
可选的,插件目录可以包括一个或多个代理插件,也可以包括一个或多个代理插件中各个代理插件的插件标识,此时插件目录可通过各个插件标识来指示相应的代理插件,等等;为了便于阐述,后续均以插件目录包括代理插件为例进行说明。需要说明的是,任意两次扫描之间的间隔时长(如当前扫描与上一次扫描之间的间隔时长,即当前扫描时间与上一次扫描时间之间的差值)可以是按照经验设置的,也可以是按照实际需求设置的,还可以是随机生成的,本发明对此不作限定;也就是说,电子设备可定时对插件目录进行扫描(即间断固定时长对插件目录进行扫描),也可不定时对插件目录进行扫描(即间断不固定时长对插件目录进行扫描),本发明对此不作限定。
第二种获取方式:电子设备可获取插件下载链接,并基于该插件下载链接下载代理插件,从而将下载的代理插件作为目标代理插件,以获取到目标代理插件,等等。在此种情况下,电子设备还可将目标代理插件添加至插件目录中,等等。
需要说明的是,上述至少一个目标嵌码类可以包括但不限于:性能监控嵌码类和数据链路追踪嵌码类等,本发明对此不作限定;其中,性能监控嵌码类可用于使嵌入性能监控嵌码类中的嵌码后的原始嵌码类支持性能监控,数据链路追踪嵌码类可用于使嵌入数据链路追踪嵌码类中的嵌码后的原始嵌码类支持数据链路追踪。相应的,上述M个目标插件依赖工具类可以包括但不限于:自定义工具类(用于实现自定义规则的类)、bean拷贝工具类(用于实现数据拷贝的类)以及Http(HyperText Transfer Protocol,超文本传输协议)请求工具类(用于实现调用POST请求或者Get请求的类),等等;本发明对此不作限定。其中,POST请求和Get请求均为一个Http请求。
可选的,一个目标嵌码类可以包括但不限于:用于嵌入相应原始嵌码类的嵌码、所需嵌入的位置指示信息以及匹配因素等,本发明对此不作限定。其中,一个嵌码类的匹配因素可以包括但不限于:所需修改方法的方法名、类名以及方法签名等,本发明对此不作限定。
S102,基于至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,一个匹配原始类加载器包括:分别与各个目标嵌码类相对应的原始嵌码类,N为非负整数。
应当理解的是,一个匹配原始类加载器中存在与任一目标嵌码类相对应的原始嵌码类,以使各个目标嵌码类中的嵌码,可用于分别嵌入至一个匹配原始类加载器中的相应原始嵌码类中。其中,一个匹配原始类加载器包括分别与各个目标嵌码类相对应的原始嵌码类可以指的是:一个匹配原始类加载器支持加载的原始嵌码类可以包括分别与各个目标嵌码类相对应的原始嵌码类。
在具体的实现中,电子设备可遍历至少一个原始类加载器中的各个原始类加载器,并将当前遍历的原始类加载器作为当前原始类加载器;然后,可确定至少一个目标嵌码类中的各个目标嵌码类的匹配因素,并基于各个目标嵌码类的匹配因素,判断当前原始类加载器是否包括分别与各个目标嵌码类相对应的原始嵌码类,一个目标嵌码类的匹配因素与相应的原始嵌码类的匹配因素相同;若当前原始类加载器包括分别与各个目标嵌码类相对应的原始嵌码类,则将当前原始类加载器作为一个匹配原始类加载器;在遍历完各个原始类加载器后,得到N个匹配原始类加载器,以实现从至少一个原始类加载器中确定出N个匹配原始类加载器。其中,匹配原始类加载器与目标代理插件适配,即匹配原始类加载器与至少一个目标嵌码类适配。
示例性的,假设至少一个原始类加载器包括原始类加载器1、原始类加载器2以及原始类加载器3,那么电子设备可分别确定原始类加载器1、原始类加载器2以及原始类加载器3是否与目标代理插件适配,即分别确定这三个原始类加载器是否与至少一个目标嵌码类适配。进一步的,假设原始类加载器1包括原始嵌码类1、原始嵌码类2、原始嵌码类3、原始嵌码类4以及原始嵌码类5,原始类加载器2包括原始嵌码类2和原始嵌码类3,以及原始类加载器3包括原始嵌码类1和原始嵌码类6,至少一个目标嵌码类包括目标嵌码类1、目标嵌码类2以及目标嵌码类3,且假设目标嵌码类1与原始嵌码类1相对应、目标嵌码类2与原始嵌码类2相对应,以及目标嵌码类3与原始嵌码类3相对应,那么电子设备可确定原始类加载器1包括分别与各个目标嵌码类相对应的原始嵌码类(即原始嵌码类1、原始嵌码类2以及原始嵌码类3),此时可确定原始类加载器1与至少一个目标嵌码类适配,即与目标代理插件适配,那么电子设备可将原始类加载器1作为一个匹配原始类加载器,以从至少一个原始类加载器中确定出N个匹配原始类加载器,此时N的取值为1。在此种情况下,目标嵌码类1可包括用于嵌入原始嵌码类1的嵌码,目标嵌码类2可包括用于嵌入原始嵌码类2的嵌码,目标嵌码类3可包括用于嵌入原始嵌码类3的嵌码,也就是说,目标嵌码类1中的嵌码可用于嵌入原始类加载器1中的原始嵌码类1中,目标嵌码类2中的嵌码可用于嵌入原始类加载器1中的原始嵌码类2中,目标嵌码类3中的嵌码可用于嵌入原始类加载器1中的原始嵌码类3中。
S103,若M和N均为正整数,则基于目标代理插件对应的目标插件类加载器标识,以及N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加目标插件类加载器标识所指示的目标插件类加载器和各个匹配原始类加载器之间的对应关系。
其中,目标插件类加载器(PluginClassLoader)用于加载M个目标插件依赖工具类,且键映射数据用于在需加载任一插件依赖工具类时确定相应的插件类加载器。
应当理解的是,类加载器标识(如目标插件类加载器标识或匹配原始类加载器的类加载器标识等)可以是数字标识,也可以是字母标识等,本发明对此不作限定;其中,目标插件类加载器标识是指目标代理插件对应的目标插件类加载器的插件类加载器标识。示例性的,插件类加载器1的类加载器标识可以为插件类加载器标识1或PluginClassLoader1等,原始类加载器1的类加载器标识可以为类加载器标识1或ClassLoader1等。
在本发明实施例中,键映射数据用于存储各个插件类加载器和相应原始类加载器之间的对应关系(即映射关系);具体的,键映射数据可用于存储各个插件类加载器的插件类加载器标识和相应原始类加载器的类加载器标识之间的对应关系,以实现将各个插件类加载器和相应原始类加载器之间的对应关系存储至键映射数据中。
那么相应的,调用任一原始类加载器以加载任一嵌入嵌码后的原始嵌码类,且该任一嵌入嵌码后的原始嵌码类引用了任一插件依赖工具类时,电子设备可基于任一原始类加载器的类加载器标识,从键映射数据中查找出与该任一原始类加载器的类加载器标识相对应的插件类加载器标识,从而调用查找出的插件类加载器标识所指示的插件类加载器,对任一插件依赖工具类进行加载,以实现对任一嵌入嵌码后的原始嵌码类的加载。
在本发明实施例中,键映射数据可用于指示P个类加载组中各个类加载组与Q个插件类加载器中相应插件类加载器之间的对应关系,一个类加载组至少包括一个原始类加载器,以使键映射数据用于指示原始类加载器与插件类加载器之间的对应关系,即使键映射数据可用于指示Y个原始类加载器中各个原始类加载器与Q个插件类加载器中相应插件类加载器之间的对应,P和Q均为非负整数,且Y为非负整数,且Y小于或等于P。可选的,一个类加载组还可包括至少一个插件依赖工具类,以使键映射数据用于指示原始类加载器与插件依赖工具类所构成的类加载组,与插件类加载器之间的对应关系。在此种情况下,电子设备可从键映射数据中,确定出任一类加载组对应的插件类加载器。可选的,当一个类加载组仅包括一个插件依赖工具类时,键映射数据也可称为双键映射数据(双KeyMap);当一个类加载组支持包括多个插件依赖工具类时,键映射数据也可以称为多键映射数据。
基于此,在基于目标代理插件对应的目标插件类加载器标识,以及N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加目标插件类加载器标识所指示的目标插件类加载器和各个匹配原始类加载器之间的对应关系时,电子设备可确定M个目标插件依赖工具类中各个目标插件依赖工具类的类标识,并基于各个目标插件依赖工具类的类标识、目标代理插件对应的目标插件类加载器标识,以及N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加目标插件类加载器标识所指示的目标插件类加载器和各个目标类加载组之间的对应关系。其中,一个目标类加载组包括一个匹配原始类加载器和M个目标插件依赖工具类中的至少一个目标插件依赖工具类,以实现在键映射数据中添加目标插件类加载器和各个匹配原始类加载器之间的对应关系。可选的,类标识可以为数字标识,也可以为字母标识等,本发明对此不作限定;可选的,任一插件依赖工具类的类标识可以为该任一插件依赖工具类的包名(packageName,也可称为类名)。
进一步的,在基于各个目标插件依赖工具类的类标识、目标代理插件对应的目标插件类加载器标识,以及N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加目标插件类加载器标识所指示的目标插件类加载器和各个目标类加载组之间的对应关系时,电子设备可针对N个匹配原始类加载器中的任一匹配原始类加载器,基于各个目标插件依赖工具类的类标识、目标代理插件对应的目标插件类加载器标识,以及任一匹配原始类加载器的类加载器标识,在键映射数据中添加H个目标类加载组标识中每个目标类加载组标识和目标插件类加载器标识之间的对应关系,H个目标类加载组标识中的任一目标类加载组标识用于指示任一匹配原始类加载器和M个目标插件依赖工具类中的至少一个目标插件依赖工具类所构成的目标类加载组,以实现在键映射数据中添加任一匹配原始类加载器对应的H个目标类加载组和目标插件类加载器标识所指示的目标插件类加载器之间的对应关系。其中,H为正整数;当每个目标类加载组均包括一个匹配原始类加载器和一个目标插件依赖工具类时,H等于M,一个目标类加载组标识包括一个类加载器标识和一个类标识;当一个目标类加载组支持包括一个匹配原始类加载器和多个目标插件依赖工具类时,H小于或等于M,一个目标类加载组标识支持包括一个类加载器标识和多个类标识,也就是说,一个目标类加载组标识可以包括一个类加载器标识和至少一个类标识。
在一种实施方式中,当每个目标类加载组均包括一个匹配原始类加载器和一个目标插件依赖工具类时,键映射数据可以包括行键(RowKey)和列键(ColumnKey),且行键可用于指示原始类加载器的类加载器标识,列键可用于指示插件依赖工具类的类标识,以通过行键和列键来指示类加载组,从而指示类加载组与插件类加载器之间的对应关系。在此种情况下,电子设备可将各个目标插件依赖工具类的类标识、目标代理插件对应的目标插件类加载器标识,以及任一匹配原始类加载器的类加载器标识添加至键映射数据中,以更新行键和列键,以及行键和列键所构成的类加载组标识对应的插件类加载器标识(即类加载组标识在键映射数据中的值),从而实现在键映射数据中添加任一匹配原始类加载器对应的H个目标类加载组和目标插件类加载器标识所指示的目标插件类加载器之间的对应关系。应当理解的是,当任一类加载组不存在对应的插件类加载器时,该任一类加载组对应的类加载组标识在键映射数据中的值可以为空。
示例性的,如图3a所示,假设任一匹配原始类加载器为原始类加载器A,M个目标插件依赖工具类包括插件依赖工具类A和插件依赖工具类B,那么电子设备可将类加载器标识A(原始类加载器A的类加载器标识)、类标识A(插件依赖工具类A的类标识)、类标识B(插件依赖工具类B的类标识)以及目标插件类加载器标识(如插件类加载器标识A)添加至键映射数据中,从而将类加载器标识A添加至行键中,并将类标识A和类标识B添加至列键中,以在键映射数据中添加任一匹配原始类加载器对应的H个目标类加载组和目标插件类加载器之间的对应关系,此时H的取值为2。在此种情况下,类加载器标识A和类标识A所构成的类加载组标识对应的插件类加载器标识为插件类加载器标识A,且类加载器标识A和类标识B所构成的类加载组标识对应的插件类加载器标识为插件类加载器标识A,从而采用类加载器标识A和类标识A所构成的类加载组标识与插件类加载器标识A之间的对应关系,以及类加载器标识A和类标识B所构成的类加载组标识与插件类加载器标识A之间的对应关系更新键映射数据。
另一种实施方式中,键映射数据可以是通过键映射组来指示类加载组与插件类加载器之间的对应关系的,一个键映射组可以包括一个类加载组和相应的插件类加载器。在此种情况下,电子设备可基于各个目标插件依赖工具类的类标识、目标代理插件对应的目标插件类加载器标识,以及任一匹配原始类加载器的类加载器标识构建至少一个目标键映射组标识,并将至少一个目标键映射组标识添加至键映射数据中,以实现在键映射数据中添加任一匹配原始类加载器对应的H个目标类加载组和目标插件类加载器标识所指示的目标插件类加载器之间的对应关系,一个键映射组标识用于指示一个键映射组。其中,当每个目标类加载组均包括一个匹配原始类加载器和一个目标插件依赖工具类时,至少一个目标键映射组标识中键映射组标识的数量等于M,即任一匹配原始类加载器对应的键映射组的数量等于M;当一个目标类加载组支持包括一个匹配原始类加载器和多个目标插件依赖工具类时,至少一个目标键映射组标识中键映射组标识的数量为1。
例如,如图3b所示,当每个目标类加载组均包括一个匹配原始类加载器和一个目标插件依赖工具类时,假设任一匹配原始类加载器为原始类加载器A,M个目标插件依赖工具类包括插件依赖工具类A和插件依赖工具类B,那么电子设备可采用类加载器标识A、类标识A、类标识B以及目标插件类加载器标识(如插件类加载器标识A)构建至少一个键映射组标识,此时至少一个键映射组标识可包括由类标识A、类加载器标识A以及插件类加载器标识A构成的键映射组标识,以及由类标识B、类加载器标识A以及插件类加载器标识A构成的键映射组标识,相应的,电子设备可将至少一个键映射组标识添加至键映射数据中。又如,如图3c所示,当一个目标类加载组支持包括一个匹配原始类加载器和多个目标插件依赖工具类时,电子设备可采用类加载器标识A、类标识A、类标识B以及插件类加载器标识A(即目标插件类加载器标识)构建至少一个键映射组标识,此时至少一个键映射组标识可包括由类标识A、类标识B、类加载器标识A以及插件类加载器标识A构成的键映射组标识,那么电子设备可将至少一个键映射组标识添加至键映射数据中。
在本发明实施例中,目标插件类加载器的父类为各个匹配原始类加载器,从而可以保证目标插件依赖工具类中对任一匹配原始类加载器中的类的引用也可以被找到。可见,目标插件类加载器保留了任一匹配原始类加载器的引用,在加载类时可保证能找到的类和任一匹配原始类加载器一致;并且,本发明实施例保留了插件依赖工具类的类标识,保证了代理插件在加载和卸载,以及类加载时能够找到插件依赖工具类的方法,以及能够找到相应的插件类加载器等。
S104,分别将各个目标嵌码类中的嵌码,嵌入至各个匹配原始类加载器中的相应原始嵌码类中,并生成目标插件类加载器,以实现目标代理插件的加载,目标插件类加载器在M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。
示例性的,假设至少一个原始类加载器包括原始类加载器1、原始类加载器2以及原始类加载器3,至少一个目标嵌码类包括目标嵌码类1、目标嵌码类2以及目标嵌码类3,且仅有原始类加载器1包括目标嵌码类1对应的原始嵌码类1、目标嵌码类2对应的原始嵌码类2以及目标嵌码类3对应的原始嵌码类3,原始类加载器2仅包括原始嵌码类2和原始嵌码类3,以及原始类加载器3仅包括原始嵌码类1,在此种情况下,N个匹配原始类加载器包括原始类加载器1。那么相应的,电子设备可将目标嵌码类1中的嵌码嵌入至原始类加载器1中的原始嵌码类1中,将目标嵌码类2中的嵌码嵌入至原始类加载器1中的原始嵌码类2中,以及将目标嵌码类3中的嵌码嵌入至原始类加载器1中的原始嵌码类3中。
可选的,在分别将各个目标嵌码类中的嵌码,嵌入至各个匹配原始类加载器中的相应原始嵌码类中后,电子设备可在第一次对一个目标嵌码类对应的原始嵌码类(即嵌入嵌码后的原始嵌码类)进行加载时,生成目标插件类加载器;或者,电子设备可在分别将各个目标嵌码类中的嵌码,嵌入至各个匹配原始类加载器中的相应原始嵌码类中后,生成目标插件类加载器;或者,电子设备可在确定M和N均为正整数时,生成目标插件类加载器,等等;本发明对此不作限定。可选的,本发明实施例可优选在第一次对目标嵌码类对应的嵌入嵌码后的原始嵌码类进行加载时,生成目标插件类加载器。
可选的,电子设备可包括虚拟机,在此种情况下,电子设备可通过虚拟机,执行上述步骤S101至S104。
可选的,若M等于零且N为正整数,电子设备则可不执行步骤S103,以及不执行步骤S104中的生成目标插件类加载器,也就是说,在确定出N个匹配原始类加载器后,电子设备可分别将各个目标嵌码类中的嵌码,嵌入至各个匹配原始类加载器中的相应原始嵌码类中,以实现目标代理插件的加载。可选的,若N等于零,电子设备则可不执行步骤S103和步骤S104,在此种情况下,至少一个原始类加载器中不存在匹配原始类加载器,即任一原始类加载器仅包括分别与G个目标嵌码类中每个目标嵌码类相对应的原始嵌码类,G为非负整数,且G小于至少一个目标嵌码类中的嵌码类个数;也就是说,此时电子设备可不加载目标代理插件。
综上可见,传统的代理插件加载过程通常将插件依赖工具类打入到原始类加载器中,或者打入到BootstrapClassLoader等中去,以实现代理插件的加载,从而通过原始类加载器等对插件依赖工具类进行加载,如图4a所示;在此种情况下,可使用NewClassAppender(新类输出目的地,用于负责数据的输出)的方式,将插件依赖工具类的字节码注入到原始类加载器,从而保证相应原始类加载器中嵌码能找到插件依赖工具类,同时插件依赖工具类中依赖的类(即嵌入嵌码后的原始嵌码类)在相应原始类加载器中也能找到,从而可以实现嵌入嵌码后的原始嵌码类的加载,但这种方式会由于插件依赖工具类所属的类加载器(如原始类加载器或引导类加载器等)在应用程序运行过程中无法卸载,从而导致插件依赖工具类无法卸载,即无法动态卸载或变更代理插件等。其中,图4a中的引导类加载器可以为扩展类加载器(ExtensionClassLoader)的父类,且扩展类加载器可以为应用程序类加载器(AppClassLoader)的父类;并且,可通过代理类加载器(AgentClassLoader)实现对类加载器嵌入嵌码,保证能够访问到Proxy API(代理接口)等,以实现违反双亲委派机制。
在本发明实施例中,可通过键映射数据确定原始类加载器与插件类加载器之间的对应关系,并通过插件类加载器对相应的插件依赖工具类进行加载,如图4b所示。其中,在需加载插件依赖工具类(如目标插件依赖工具类A)时,可通过如图4b所示的插件类加载器访问接口(PluginClassLoaderFactory)访问键映射数据,从而确定所需使用的插件类加载器;并且,嵌入嵌码后的原始嵌码类可对相应的插件依赖工具类进行引用,从而通过相应的插件类加载器对相应插件依赖工具类进行加载,从而将相应的插件依赖工具类返回至相应原始类加载器。
本发明实施例可在获取到目标代理插件后,基于至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类;其中,一个目标嵌码类包括用于嵌入相应原始嵌码类的嵌码,一个目标插件依赖工具类用于被嵌入相应目标嵌码类中的嵌码后的原始嵌码类所引用。进一步的,若M和N均为正整数,则可基于目标代理插件对应的目标插件类加载器标识,以及N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加目标插件类加载器标识所指示的目标插件类加载器和各个匹配原始类加载器之间的对应关系,目标插件类加载器用于加载M个目标插件依赖工具类,且键映射数据用于在需加载任一插件依赖工具类时确定相应的插件类加载器;然后,可分别将各个目标嵌码类中的嵌码,嵌入至各个匹配原始类加载器中的相应原始嵌码类中,并生成目标插件类加载器,以实现目标代理插件的加载,目标插件类加载器在M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。可见,本发明实施例可在目标代理插件对应的应用程序的运行过程中,实现对目标代理插件的动态加载,从而使得目标插件类加载器支持被动态卸载,以使M个目标插件依赖工具类支持被动态卸载,进而使得目标代理插件支持被动态卸载,即可支持对目标代理插件的动态卸载等;也就是说,可在无需应用程序重启的情况下,实现对目标代理插件的动态加载和卸载等。
基于上述描述,本发明实施例还提出一种更为具体的插件处理方法。相应的,该插件处理方法可以由上述所提及的电子设备(终端或服务器)执行;或者,该插件处理方法可由终端和服务器共同执行。为了便于阐述,后续均以电子设备执行该插件处理方法为例进行说明;请参见图5,该插件处理方法可包括以下步骤S501-S508:
S501,在检测到初始代理插件需被卸载时,确定初始代理插件中至少一个初始嵌码类中各个初始嵌码类对应的原始嵌码类,初始代理插件包括至少一个初始嵌码类和W个初始插件依赖工具类,任一初始嵌码类对应的原始嵌码类嵌入有相应初始嵌码类包括的嵌码,W为非负整数。
其中,初始代理插件是对插件目录进行扫描所确定的;具体的,电子设备可对插件目录进行扫描,并在扫描到初始代理插件从插件目录中被删除时,确定检测到初始代理插件需被卸载;或者,在扫描到初始代理插件被更新时,确定检测到初始代理插件需被卸载,以实现初始代理插件的重新加载;其中,在扫描到初始代理插件被更新为目标代理插件时(即在扫描到初始代理插件被更新,且将初始代理插件对应的更新后的代理插件作为目标代理插件时),支持实现将初始代理插件重新加载为目标代理插件,也就是说,支持实现卸载初始代理插件,并加载目标代理插件,从而实现代理插件的重加载。换句话说,在插件目录中扫描到被删除代理插件时,可将该被删除代理插件作为初始代理插件,且确定扫描到初始代理插件从插件目录中被删除,从而确定检测到初始代理插件需被卸载;或者,在插件目录中扫描到被更新代理插件时,可将该被更新代理插件作为初始代理插件,且确定扫描到初始代理插件被更新,从而确定检测到初始代理插件需被卸载。
在一种实施方式中,电子设备可采用当前扫描结果与上一次扫描结果进行对比,从而判断任一代理插件是否为需处理代理插件,其中,当前扫描结果是在当前扫描时间下对插件目录进行扫描的结果,上一次扫描结果是在上一次扫描时间下对插件目录进行扫描的结果,且任一代理插件为当前扫描结果和/或上一次扫描结果中的代理插件,需处理代理插件可以包括以下任一种:被删除代理插件、新增代理插件以及被更新代理插件。那么相应的,当任一代理插件为被删除代理插件或被更新代理插件时,可将任一代理插件作为初始代理插件,从而扫描到初始代理插件从插件目录中被删除或扫描到初始代理插件被更新;并且,当任一代理插件为被更新代理插件时,电子设备可将任一代理插件对应的更新后的代理插件作为目标代理插件。
在此种情况下,被删除代理插件是指当前扫描时不存在且上一次扫描时存在的代理插件,即可以指的是不位于当前扫描时的插件目录(即当前扫描结果)且位于上一次扫描时的插件目录(即上一次扫描结果)中的代理插件;也就是说,若初始代理插件不位于当前扫描结果且位于上一次扫描结果中,则可扫描到初始代理插件从插件目录中被删除。相应的,被更新代理插件可以指的是当前扫描结果中更新时间与上一次扫描结果中相应更新时间不同的代理插件;或者,也可以指的是更新时间位于当前扫描时间和上一次扫描时间之间的代理插件(即可以指的是更新时间晚于上一次扫描时间且早于当前扫描时间的代理插件);也就是说,若初始代理插件的更新时间晚于上一次扫描时间且早于当前扫描时间,或初始代理插件在当前扫描结果中的更新时间与在上一次扫描结果中的更新时间不同,则可扫描到初始代理插件被更新。相应的,所谓的新增代理插件可以指的是当前扫描时存在且上一次扫描时不存在的代理插件,即可以指的是位于当前扫描结果但不位于上一次扫描结果中的代理插件;在本发明实施例中,当上述任一代理插件为新增代理插件时,可将任一代理插件作为目标代理插件。
另一种实施方式中,电子设备可采用当前扫描结果与当前加载的插件信息进行对比,从而判断任一代理插件是否为需处理代理插件,如图6所示;其中,当前加载的插件信息是指当前系统时间下已加载的插件信息,且任一代理插件为当前扫描结果或当前加载的插件信息中的代理插件。那么相应的,当任一代理插件为被删除代理插件或被更新代理插件时,可将任一代理插件作为初始代理插件,从而扫描到初始代理插件从插件目录中被删除或扫描到初始代理插件被更新;并且,当任一代理插件为被更新代理插件时,可将任一代理插件对应的更新后的代理插件作为目标代理插件。
在此种情况下,被删除代理插件可以指的是不位于当前扫描结果且位于当前加载的插件信息中的代理插件;也就是说,若初始代理插件不位于当前扫描结果且位于当前加载的插件信息中,则可扫描到初始代理插件从插件目录中被删除。相应的,被更新代理插件可以指的是当前扫描结果中的更新时间晚于当前加载的插件信息中的加载时间的代理插件;也就是说,若初始代理插件在当前扫描结果中的更新时间晚于在当前加载的插件信息中的加载时间,则可扫描到初始代理插件被更新。相应的,新增代理插件可以指的是位于当前扫描结果且不位于当前加载的插件信息中的代理插件。
可选的,当插件目录中的任一代理插件被更新时,电子设备还可生成任一代理插件的更新标识,从而使得当前扫描结果可包括任一代理插件的更新标识,在此种情况下,电子设备基于当前扫描结果,将具有更新标识的代理插件作为被更新代理插件,等等;本发明对需处理代理插件的具体确定方式不作限定。可选的,更新标识可以为数字标识,也可以为字母标识等,本发明对此不作限定。
在本发明实施例中,若任一代理插件为需处理代理插件,则可按照任一代理插件对应的处理逻辑对任一代理插件进行处理。其中,被删除代理插件对应的处理逻辑可以为插件卸载逻辑(此时可按照插件卸载逻辑对相应代理插件执行卸载操作),新增代理插件对应的处理逻辑可以为插件新增逻辑(此时可按照插件新增逻辑对相应代理插件执行加载操作),被更新代理插件对应的处理逻辑可以为插件更新逻辑(此时可按照插件更新逻辑对相应代理插件执行重加载操作)。
S502,当初始代理插件从插件目录中被删除后,分别对各个初始嵌码类对应的原始嵌码类进行动态加载,以实现删除各个初始嵌码类对应的原始嵌码类中嵌入的嵌码。
可选的,在扫描到初始代理插件从插件目录中被删除时,电子设备可直接执行上述分别对各个初始嵌码类对应的原始嵌码类进行动态加载(即重新加载,也可表示为retransform);在扫描到初始代理插件被更新时,电子设备可从插件目录中删除初始代理插件,再执行上述分别对各个初始嵌码类对应的原始嵌码类进行动态加载,此时若初始代理插件被更新为目标代理插件,则可在后续加载目标代理插件时,将目标代理插件添加至插件目录中,从而实现对目标代理插件的加载,以实现对初始代理插件的重新加载。
应当理解的是,当初始代理插件从插件目录中被删除后,对各个初始嵌码类对应的原始嵌码类进行动态加载时,可加载不到各个初始嵌码类中的嵌码,从而使得各个初始嵌码类中的嵌码无法嵌入至相应原始嵌码类中,故可实现删除各个初始嵌码类对应的原始嵌码类中嵌入的嵌码。可见,在检测到初始代理插件需被卸载时,初始代理插件中的代码(即初始嵌码类中的嵌码)可从相应的原始类加载器中卸载,以确保不再影响应用程序的运行。
S503,当W大于0时,在键映射数据中删除初始代理插件对应的初始插件类加载器与相应原始类加载器之间的对应关系。
在本发明实施例中,当W大于0时,键映射数据中可包括初始插件类加载器与相应原始类加载器之间的对应关系,即键映射数据中可包括初始插件类加载器的初始插件类加载器标识和相应类加载器标识之间的对应关系,在此种情况下,电子设备可在键映射数据中删除初始插件类加载器标识与相应类加载器标识之间的对应关系,从而实现在键映射数据中删除初始代理插件对应的初始插件类加载器与相应原始类加载器之间的对应关系,从而避免键映射数据中的类加载器标识等过多的情况下导致内存泄露风险,也就是说,可在对代理插件进行反复加载和卸载时,避免键映射数据中原始类加载器与相应插件类加载器之间的对应关系过多而导致内存泄露风险。
S504,卸载初始插件类加载器,以实现卸载W个初始插件依赖工具类,以及实现卸载初始代理插件。
在本发明实施例中,在应用程序关闭或者初始代理插件需被卸载时,可对初始代理插件所占内存进行释放,以便于应用程序能够正常退出或继续运行。
S505,获取目标代理插件,目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类。
S506,基于至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,一个匹配原始类加载器包括:分别与各个目标嵌码类相对应的原始嵌码类。
S507,若M和N均为正整数,则基于目标代理插件对应的目标插件类加载器标识,以及N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加目标插件类加载器标识所指示的目标插件类加载器和各个匹配原始类加载器之间的对应关系。
S508,分别将各个目标嵌码类中的嵌码,嵌入至各个匹配原始类加载器中的相应原始嵌码类中,并生成目标插件类加载器,以实现目标代理插件的加载,目标插件类加载器在M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。
可选的,针对N个匹配原始类加载器中的任一匹配原始类加载器,电子设备可对各个目标嵌码类在任一匹配原始类加载器中的相应原始嵌码类进行动态加载,以实现将各个目标嵌码类中的嵌码,嵌入至任一匹配原始类加载器中的相应原始嵌码类中。
在本发明实施例中,针对至少一个目标嵌码类中的任一目标嵌码类,以及N个匹配原始类加载器中的任一匹配原始类加载器,在需对嵌入任一目标嵌码类中的嵌码后的任一原始嵌码类进行加载时,电子设备可调用任一匹配原始类加载器,对任一原始嵌码类进行加载;当任一原始嵌码类引用了M个目标插件依赖工具类中的待引用插件依赖工具类时,可从键映射数据中确定出用于加载待引用插件依赖工具类的目标插件类加载器,并调用目标插件类加载器,对待引用插件依赖工具类进行加载,以完成对任一原始嵌码类的加载操作,待引用插件依赖工具类可以为M个目标插件依赖工具类中的任一目标插件依赖工具类。
具体的,电子设备可基于待引用插件依赖工具类的类标识和任一匹配原始类加载器的类加载器标识,从键映射数据中确定出目标插件类加载器标识,也就是说,可从键映射数据中查找包括待引用插件依赖工具类的类标识和任一匹配原始类加载器的类加载器标识的类加载组标识,并基于查找到的类加载组标识从键映射数据中确定出目标插件类加载器标识;然后,可根据目标插件类加载器标识确定目标插件类加载器,以实现从键映射数据中确定出用于加载待引用插件依赖工具类的目标插件类加载器。可见,本发明实施例可通过对匹配原始类加载器中相应的原始嵌码类进行嵌码,以修改加载类的逻辑,从而通过目标插件类加载器来完成任一匹配原始类加载器对于待引用插件依赖工具类的类加载。
应当理解的是,初始代理插件被重加载为目标代理插件的过程,即是先对初始代理插件进行卸载,再对目标代理插件进行加载的过程。可选的,在代理插件加载、重加载以及卸载过程中,电子设备可通过Java Agent提供事件通知机制或回调函数(如代理插件的加载或重加载通知等),以使用户(如开发人员)能够响应这些变化,这使得开发人员能够执行一些额外的逻辑,如重新初始化代理插件、更新配置等。可选的,电子设备还可记录代理插件加载、更新以及卸载的状态信息等,以便于用户在需要排查问题时提供相关的日志或信息等。
本发明实施例可在检测到初始代理插件需被卸载时,确定初始代理插件中至少一个初始嵌码类中各个初始嵌码类对应的原始嵌码类,初始代理插件包括至少一个初始嵌码类和W个初始插件依赖工具类,任一初始嵌码类对应的原始嵌码类嵌入有相应初始嵌码类包括的嵌码,W为非负整数;当初始代理插件从插件目录中被删除后,可分别对各个初始嵌码类对应的原始嵌码类进行动态加载,以实现删除各个初始嵌码类对应的原始嵌码类中嵌入的嵌码;当W大于0时,可在键映射数据中删除初始代理插件对应的初始插件类加载器与相应原始类加载器之间的对应关系;基于此,可卸载初始插件类加载器,以实现卸载W个初始插件依赖工具类,以及实现卸载初始代理插件。并且,可获取目标代理插件,并基于至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类;若M和N均为正整数,则基于目标代理插件对应的目标插件类加载器标识,以及N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加目标插件类加载器标识所指示的目标插件类加载器和各个匹配原始类加载器之间的对应关系,目标插件类加载器用于加载M个目标插件依赖工具类,且键映射数据用于在需加载任一插件依赖工具类时确定相应的插件类加载器;然后,可分别将各个目标嵌码类中的嵌码,嵌入至各个匹配原始类加载器中的相应原始嵌码类中,并生成目标插件类加载器,以实现目标代理插件的加载,目标插件类加载器在M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。可见,本发明实施例可在应用程序运行过程中,实现对代理插件的动态加载(如目标代理插件的加载)、卸载(如初始代理插件的卸载)以及重加载(如将初始代理插件重新加载为目标代理插件)等,可有效避免代理插件更新(如代理插件中的嵌码类或插件依赖工具类更新)而导致代理插件无法重新加载成功的问题,也就是说,本发明实施例可将插件依赖工具类等安全地更新到应用程序中,而不影响应用程序的运行。
基于上述插件处理方法的相关实施例的描述,本发明实施例还提出了一种插件处理装置,该插件处理装置可以是运行于电子设备中的一个计算机程序(包括程序代码);如图7所示,该插件处理装置可包括获取单元701和处理单元702。该插件处理装置可以执行图1或图5所示的插件处理方法,即该插件处理装置可以运行上述单元:
获取单元701,用于获取目标代理插件,所述目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类,M为非负整数;其中,一个目标嵌码类包括用于嵌入相应原始嵌码类的嵌码,一个目标插件依赖工具类用于被嵌入相应目标嵌码类中的嵌码后的原始嵌码类所引用;
处理单元702,用户基于所述至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,一个匹配原始类加载器包括:分别与所述各个目标嵌码类相对应的原始嵌码类,N为非负整数;
所述处理单元702,还用于若M和N均为正整数,则基于所述目标代理插件对应的目标插件类加载器标识,以及所述N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加所述目标插件类加载器标识所指示的目标插件类加载器和所述各个匹配原始类加载器之间的对应关系,所述目标插件类加载器用于加载所述M个目标插件依赖工具类,且所述键映射数据用于在需加载任一插件依赖工具类时确定相应的插件类加载器;
所述处理单元702,还用于分别将所述各个目标嵌码类中的嵌码,嵌入至所述各个匹配原始类加载器中的相应原始嵌码类中,并生成所述目标插件类加载器,以实现所述目标代理插件的加载,所述目标插件类加载器在所述M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。
在一种实施方式中,处理单元702在基于所述至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器时,可具体用于:
遍历至少一个原始类加载器中的各个原始类加载器,并将当前遍历的原始类加载器作为当前原始类加载器;
确定所述至少一个目标嵌码类中的各个目标嵌码类的匹配因素,并基于所述各个目标嵌码类的匹配因素,判断所述当前原始类加载器是否包括分别与所述各个目标嵌码类相对应的原始嵌码类,一个目标嵌码类的匹配因素与相应的原始嵌码类的匹配因素相同;
若所述当前原始类加载器包括分别与所述各个目标嵌码类相对应的原始嵌码类,则将所述当前原始类加载器作为一个匹配原始类加载器;
在遍历完所述各个原始类加载器后,得到N个匹配原始类加载器,以实现从所述至少一个原始类加载器中确定出所述N个匹配原始类加载器。
另一种实施方式中,所述键映射数据用于指示P个类加载组中各个类加载组与Q个插件类加载器中相应插件类加载器之间的对应关系,一个类加载组至少包括一个原始类加载器,以使所述键映射数据用于指示原始类加载器与插件类加载器之间的对应关系,P和Q均为非负整数;处理单元702在基于所述目标代理插件对应的目标插件类加载器标识,以及所述N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加所述目标插件类加载器标识所指示的目标插件类加载器和所述各个匹配原始类加载器之间的对应关系时,可具体用于:
确定所述M个目标插件依赖工具类中各个目标插件依赖工具类的类标识;
基于所述各个目标插件依赖工具类的类标识、所述目标代理插件对应的目标插件类加载器标识,以及所述N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在所述键映射数据中添加所述目标插件类加载器标识所指示的目标插件类加载器和各个目标类加载组之间的对应关系;
其中,一个目标类加载组包括一个匹配原始类加载器和所述M个目标插件依赖工具类中的至少一个目标插件依赖工具类,以实现在所述键映射数据中添加所述目标插件类加载器和所述各个匹配原始类加载器之间的对应关系。
另一种实施方式中,处理单元702在基于所述各个目标插件依赖工具类的类标识、所述目标代理插件对应的目标插件类加载器标识,以及所述N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在所述键映射数据中添加所述目标插件类加载器标识所指示的目标插件类加载器和各个目标类加载组之间的对应关系时,可具体用于:
针对所述N个匹配原始类加载器中的任一匹配原始类加载器,基于所述各个目标插件依赖工具类的类标识、所述目标代理插件对应的目标插件类加载器标识,以及所述任一匹配原始类加载器的类加载器标识,在所述键映射数据中添加H个目标类加载组标识中每个目标类加载组标识和所述目标插件类加载器标识之间的对应关系,所述H个目标类加载组标识中的任一目标类加载组标识用于指示所述任一匹配原始类加载器和所述M个目标插件依赖工具类中的至少一个目标插件依赖工具类所构成的目标类加载组,以实现在所述键映射数据中添加所述任一匹配原始类加载器对应的所述H个目标类加载组和所述目标插件类加载器标识所指示的目标插件类加载器之间的对应关系;
其中,H为正整数;当每个目标类加载组均包括一个匹配原始类加载器和一个目标插件依赖工具类时,H等于M,一个目标类加载组标识包括一个类加载器标识和一个类标识;当一个目标类加载组支持包括一个匹配原始类加载器和多个目标插件依赖工具类时,H小于或等于M,一个目标类加载组标识支持包括一个类加载器标识和多个类标识。
另一种实施方式中,处理单元702还可用于:
针对所述至少一个目标嵌码类中的任一目标嵌码类,以及所述N个匹配原始类加载器中的任一匹配原始类加载器,在需对嵌入所述任一目标嵌码类中的嵌码后的任一原始嵌码类进行加载时,调用所述任一匹配原始类加载器,对所述任一原始嵌码类进行加载;
当所述任一原始嵌码类引用了所述M个目标插件依赖工具类中的待引用插件依赖工具类时,从所述键映射数据中确定出用于加载所述待引用插件依赖工具类的所述目标插件类加载器;
调用所述目标插件类加载器,对所述待引用插件依赖工具类进行加载,以完成对所述任一原始嵌码类的加载操作。
另一种实施方式中,处理单元702还可用于:
在检测到初始代理插件需被卸载时,确定所述初始代理插件中至少一个初始嵌码类中各个初始嵌码类对应的原始嵌码类,所述初始代理插件包括所述至少一个初始嵌码类和W个初始插件依赖工具类,任一初始嵌码类对应的原始嵌码类嵌入有相应初始嵌码类包括的嵌码,W为非负整数;
当所述初始代理插件从插件目录中被删除后,分别对所述各个初始嵌码类对应的原始嵌码类进行动态加载,以实现删除所述各个初始嵌码类对应的原始嵌码类中嵌入的嵌码;
当W大于0时,在所述键映射数据中删除所述初始代理插件对应的初始插件类加载器与相应原始类加载器之间的对应关系;
卸载所述初始插件类加载器,以实现卸载所述W个初始插件依赖工具类,以及实现卸载所述初始代理插件。
另一种实施方式中,所述初始代理插件是对所述插件目录进行扫描所确定的,处理单元702还可用于:
对所述插件目录进行扫描,并在扫描到所述初始代理插件从所述插件目录中被删除时,确定检测到所述初始代理插件需被卸载;或者,
在扫描到所述初始代理插件被更新时,确定检测到所述初始代理插件需被卸载,以实现所述初始代理插件的重新加载;其中,在扫描到所述初始代理插件被更新为所述目标代理插件时,支持实现将所述初始代理插件重新加载为所述目标代理插件。
根据本发明的一个实施例,图1或图5所示的方法所涉及的各个步骤均可由图7所示的插件处理装置中的各个单元来执行的。例如,图1中所示的步骤S101可由图7中所示的获取单元701执行,步骤S102-S104均可由图7中所示的处理单元702执行。又如,图5中所示的步骤S505可由图7中所示的获取单元701执行,步骤S501-S504和步骤S506-S508均可由图7中所示的处理单元702执行,等等。
根据本发明的另一个实施例,图7所示的插件处理装置中的各个单元均可以分别或全部合并为一个或若干个另外的单元来构成,或者其中的某个(些)单元还可以再拆分为功能上更小的多个单元来构成,这可以实现同样的操作,而不影响本发明的实施例的技术效果的实现。上述单元是基于逻辑功能划分的,在实际应用中,一个单元的功能也可以由多个单元来实现,或者多个单元的功能由一个单元实现。在本发明的其它实施例中,任一插件处理装置也可以包括其他单元,在实际应用中,这些功能也可以由其它单元协助实现,并且可以由多个单元协作实现。
根据本发明的另一个实施例,可以通过在包括中央处理单元(CPU)、随机存取存储介质(RAM)、只读存储介质(ROM)等处理元件和存储元件的例如计算机的通用电子设备上运行能够执行如图1或图5中所示的相应方法所涉及的各步骤的计算机程序(包括程序代码),来构造如图7中所示的插件处理装置,以及来实现本发明实施例的插件处理方法。所述计算机程序可以记载于例如计算机存储介质上,并通过计算机存储介质装载于上述电子设备中,并在其中运行。
本发明实施例可在获取到目标代理插件后,基于至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类;其中,一个目标嵌码类包括用于嵌入相应原始嵌码类的嵌码,一个目标插件依赖工具类用于被嵌入相应目标嵌码类中的嵌码后的原始嵌码类所引用。进一步的,若M和N均为正整数,则可基于目标代理插件对应的目标插件类加载器标识,以及N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加目标插件类加载器标识所指示的目标插件类加载器和各个匹配原始类加载器之间的对应关系,目标插件类加载器用于加载M个目标插件依赖工具类,且键映射数据用于在需加载任一插件依赖工具类时确定相应的插件类加载器;然后,可分别将各个目标嵌码类中的嵌码,嵌入至各个匹配原始类加载器中的相应原始嵌码类中,并生成目标插件类加载器,以实现目标代理插件的加载,目标插件类加载器在M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。可见,本发明实施例可在目标代理插件对应的应用程序的运行过程中,实现对目标代理插件的动态加载,从而使得目标插件类加载器支持被动态卸载,以使M个目标插件依赖工具类支持被动态卸载,进而使得目标代理插件支持被动态卸载,即可支持对目标代理插件的动态卸载等;也就是说,可在无需应用程序重启的情况下,实现对目标代理插件的动态加载和卸载等。
基于上述方法实施例以及装置实施例的描述,本发明示例性实施例还提供一种电子设备,包括:至少一个处理器;以及与至少一个处理器通信连接的存储器。所述存储器存储有能够被所述至少一个处理器执行的计算机程序,所述计算机程序在被所述至少一个处理器执行时用于使所述电子设备执行根据本发明实施例的方法。
本发明示例性实施例还提供一种存储有计算机程序的非瞬时计算机可读存储介质,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本发明实施例的方法。
本发明示例性实施例还提供一种计算机程序产品,包括计算机程序,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本发明实施例的方法。
参考图8,现将描述可以作为本发明的服务器或客户端的电子设备800的结构框图,其是可以应用于本发明的各方面的硬件设备的示例。电子设备旨在表示各种形式的数字电子的计算机设备,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本发明的实现。
如图8所示,电子设备800包括计算单元801,其可以根据存储在只读存储器(ROM)802中的计算机程序或者从存储单元808加载到随机访问存储器(RAM)803中的计算机程序,来执行各种适当的动作和处理。在RAM 803中,还可存储设备800操作所需的各种程序和数据。计算单元801、ROM 802以及RAM 803通过总线804彼此相连。输入/输出(I/O)接口805也连接至总线804。
电子设备800中的多个部件连接至I/O接口805,包括:输入单元806、输出单元807、存储单元808以及通信单元809。输入单元806可以是能向电子设备800输入信息的任何类型的设备,输入单元806可以接收输入的数字或字符信息,以及产生与电子设备的用户设置和/或功能控制有关的键信号输入。输出单元807可以是能呈现信息的任何类型的设备,并且可以包括但不限于显示器、扬声器、视频/音频输出终端、振动器和/或打印机。存储单元808可以包括但不限于磁盘、光盘。通信单元809允许电子设备800通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据,并且可以包括但不限于调制解调器、网卡、红外通信设备、无线通信收发机和/或芯片组,例如蓝牙TM设备、WiFi设备、WiMax设备、蜂窝通信设备和/或类似物。
计算单元801可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元801的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。计算单元801执行上文所描述的各个方法和处理。例如,在一些实施例中,插件处理方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元808。在一些实施例中,计算机程序的部分或者全部可以经由ROM802和/或通信单元809而被载入和/或安装到电子设备800上。在一些实施例中,计算单元801可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行插件处理方法。
用于实施本发明的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程插件处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本发明的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
如本发明使用的,术语“机器可读介质”和“计算机可读介质”指的是用于将机器指令和/或数据提供给可编程处理器的任何计算机程序产品、设备、和/或装置(例如,磁盘、光盘、存储器、可编程逻辑装置(PLD)),包括,接收作为机器可读信号的机器指令的机器可读介质。术语“机器可读信号”指的是用于将机器指令和/或数据提供给可编程处理器的任何信号。
为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。
计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。
并且,应理解的是,以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。
Claims (10)
1.一种插件处理方法,其特征在于,包括:
获取目标代理插件,所述目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类,M为非负整数;其中,一个目标嵌码类包括用于嵌入相应原始嵌码类的嵌码,一个目标插件依赖工具类用于被嵌入相应目标嵌码类中的嵌码后的原始嵌码类所引用;
基于所述至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,一个匹配原始类加载器包括:分别与所述各个目标嵌码类相对应的原始嵌码类,N为非负整数;
若M和N均为正整数,则基于所述目标代理插件对应的目标插件类加载器标识,以及所述N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加所述目标插件类加载器标识所指示的目标插件类加载器和所述各个匹配原始类加载器之间的对应关系,所述目标插件类加载器用于加载所述M个目标插件依赖工具类,且所述键映射数据用于在需加载任一插件依赖工具类时确定相应的插件类加载器;
分别将所述各个目标嵌码类中的嵌码,嵌入至所述各个匹配原始类加载器中的相应原始嵌码类中,并生成所述目标插件类加载器,以实现所述目标代理插件的加载,所述目标插件类加载器在所述M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。
2.根据权利要求1所述的方法,其特征在于,所述基于所述至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,包括:
遍历至少一个原始类加载器中的各个原始类加载器,并将当前遍历的原始类加载器作为当前原始类加载器;
确定所述至少一个目标嵌码类中的各个目标嵌码类的匹配因素,并基于所述各个目标嵌码类的匹配因素,判断所述当前原始类加载器是否包括分别与所述各个目标嵌码类相对应的原始嵌码类,一个目标嵌码类的匹配因素与相应的原始嵌码类的匹配因素相同;
若所述当前原始类加载器包括分别与所述各个目标嵌码类相对应的原始嵌码类,则将所述当前原始类加载器作为一个匹配原始类加载器;
在遍历完所述各个原始类加载器后,得到N个匹配原始类加载器,以实现从所述至少一个原始类加载器中确定出所述N个匹配原始类加载器。
3.根据权利要求1或2所述的方法,其特征在于,所述键映射数据用于指示P个类加载组中各个类加载组与Q个插件类加载器中相应插件类加载器之间的对应关系,一个类加载组至少包括一个原始类加载器,以使所述键映射数据用于指示原始类加载器与插件类加载器之间的对应关系,P和Q均为非负整数;所述基于所述目标代理插件对应的目标插件类加载器标识,以及所述N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加所述目标插件类加载器标识所指示的目标插件类加载器和所述各个匹配原始类加载器之间的对应关系,包括:
确定所述M个目标插件依赖工具类中各个目标插件依赖工具类的类标识;
基于所述各个目标插件依赖工具类的类标识、所述目标代理插件对应的目标插件类加载器标识,以及所述N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在所述键映射数据中添加所述目标插件类加载器标识所指示的目标插件类加载器和各个目标类加载组之间的对应关系;
其中,一个目标类加载组包括一个匹配原始类加载器和所述M个目标插件依赖工具类中的至少一个目标插件依赖工具类,以实现在所述键映射数据中添加所述目标插件类加载器和所述各个匹配原始类加载器之间的对应关系。
4.根据权利要求3所述的方法,其特征在于,所述基于所述各个目标插件依赖工具类的类标识、所述目标代理插件对应的目标插件类加载器标识,以及所述N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在所述键映射数据中添加所述目标插件类加载器标识所指示的目标插件类加载器和各个目标类加载组之间的对应关系,包括:
针对所述N个匹配原始类加载器中的任一匹配原始类加载器,基于所述各个目标插件依赖工具类的类标识、所述目标代理插件对应的目标插件类加载器标识,以及所述任一匹配原始类加载器的类加载器标识,在所述键映射数据中添加H个目标类加载组标识中每个目标类加载组标识和所述目标插件类加载器标识之间的对应关系,所述H个目标类加载组标识中的任一目标类加载组标识用于指示所述任一匹配原始类加载器和所述M个目标插件依赖工具类中的至少一个目标插件依赖工具类所构成的目标类加载组,以实现在所述键映射数据中添加所述任一匹配原始类加载器对应的所述H个目标类加载组和所述目标插件类加载器标识所指示的目标插件类加载器之间的对应关系;
其中,H为正整数;当每个目标类加载组均包括一个匹配原始类加载器和一个目标插件依赖工具类时,H等于M,一个目标类加载组标识包括一个类加载器标识和一个类标识;当一个目标类加载组支持包括一个匹配原始类加载器和多个目标插件依赖工具类时,H小于或等于M,一个目标类加载组标识支持包括一个类加载器标识和多个类标识。
5.根据权利要求1或2所述的方法,其特征在于,所述方法还包括:
针对所述至少一个目标嵌码类中的任一目标嵌码类,以及所述N个匹配原始类加载器中的任一匹配原始类加载器,在需对嵌入所述任一目标嵌码类中的嵌码后的任一原始嵌码类进行加载时,调用所述任一匹配原始类加载器,对所述任一原始嵌码类进行加载;
当所述任一原始嵌码类引用了所述M个目标插件依赖工具类中的待引用插件依赖工具类时,从所述键映射数据中确定出用于加载所述待引用插件依赖工具类的所述目标插件类加载器;
调用所述目标插件类加载器,对所述待引用插件依赖工具类进行加载,以完成对所述任一原始嵌码类的加载操作。
6.根据权利要求1或2所述的方法,其特征在于,所述方法还包括:
在检测到初始代理插件需被卸载时,确定所述初始代理插件中至少一个初始嵌码类中各个初始嵌码类对应的原始嵌码类,所述初始代理插件包括所述至少一个初始嵌码类和W个初始插件依赖工具类,任一初始嵌码类对应的原始嵌码类嵌入有相应初始嵌码类包括的嵌码,W为非负整数;
当所述初始代理插件从插件目录中被删除后,分别对所述各个初始嵌码类对应的原始嵌码类进行动态加载,以实现删除所述各个初始嵌码类对应的原始嵌码类中嵌入的嵌码;
当W大于0时,在所述键映射数据中删除所述初始代理插件对应的初始插件类加载器与相应原始类加载器之间的对应关系;
卸载所述初始插件类加载器,以实现卸载所述W个初始插件依赖工具类,以及实现卸载所述初始代理插件。
7.根据权利要求6所述的方法,其特征在于,所述初始代理插件是对所述插件目录进行扫描所确定的,所述方法还包括:
对所述插件目录进行扫描,并在扫描到所述初始代理插件从所述插件目录中被删除时,确定检测到所述初始代理插件需被卸载;或者,
在扫描到所述初始代理插件被更新时,确定检测到所述初始代理插件需被卸载,以实现所述初始代理插件的重新加载;其中,在扫描到所述初始代理插件被更新为所述目标代理插件时,支持实现将所述初始代理插件重新加载为所述目标代理插件。
8.一种插件处理装置,其特征在于,所述装置包括:
获取单元,用于获取目标代理插件,所述目标代理插件包括至少一个目标嵌码类和M个目标插件依赖工具类,M为非负整数;其中,一个目标嵌码类包括用于嵌入相应原始嵌码类的嵌码,一个目标插件依赖工具类用于被嵌入相应目标嵌码类中的嵌码后的原始嵌码类所引用;
处理单元,用于基于所述至少一个目标嵌码类中的各个目标嵌码类,从至少一个原始类加载器中确定出N个匹配原始类加载器,一个匹配原始类加载器包括:分别与所述各个目标嵌码类相对应的原始嵌码类,N为非负整数;
所述处理单元,还用于若M和N均为正整数,则基于所述目标代理插件对应的目标插件类加载器标识,以及所述N个匹配原始类加载器中各个匹配原始类加载器的类加载器标识,在键映射数据中添加所述目标插件类加载器标识所指示的目标插件类加载器和所述各个匹配原始类加载器之间的对应关系,所述目标插件类加载器用于加载所述M个目标插件依赖工具类,且所述键映射数据用于在需加载任一插件依赖工具类时确定相应的插件类加载器;
所述处理单元,还用于分别将所述各个目标嵌码类中的嵌码,嵌入至所述各个匹配原始类加载器中的相应原始嵌码类中,并生成所述目标插件类加载器,以实现所述目标代理插件的加载,所述目标插件类加载器在所述M个目标插件依赖工具类中各个目标插件依赖工具类均未被引用时支持被卸载。
9.一种电子设备,其特征在于,包括:
处理器;以及
存储程序的存储器,
其中,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行根据权利要求1-7中任一项所述的方法。
10.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使计算机执行根据权利要求1-7中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311140820.6A CN117193874A (zh) | 2023-09-05 | 2023-09-05 | 插件处理方法、装置、存储介质及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311140820.6A CN117193874A (zh) | 2023-09-05 | 2023-09-05 | 插件处理方法、装置、存储介质及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117193874A true CN117193874A (zh) | 2023-12-08 |
Family
ID=89002865
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311140820.6A Pending CN117193874A (zh) | 2023-09-05 | 2023-09-05 | 插件处理方法、装置、存储介质及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117193874A (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104679572A (zh) * | 2015-03-26 | 2015-06-03 | 北京神舟航天软件技术有限公司 | 基于预加载机制的插件支持方法 |
CN108595246A (zh) * | 2018-03-15 | 2018-09-28 | 阿里巴巴集团控股有限公司 | 一种运行应用的方法、装置及设备 |
-
2023
- 2023-09-05 CN CN202311140820.6A patent/CN117193874A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104679572A (zh) * | 2015-03-26 | 2015-06-03 | 北京神舟航天软件技术有限公司 | 基于预加载机制的插件支持方法 |
CN108595246A (zh) * | 2018-03-15 | 2018-09-28 | 阿里巴巴集团控股有限公司 | 一种运行应用的方法、装置及设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107832100B (zh) | 一种apk插件的加载方法及其终端 | |
CN107038045B (zh) | 加载库文件的方法及装置 | |
WO2019242166A1 (zh) | 应用程序更新方法、系统、计算机设备及存储介质 | |
CN107832099B (zh) | 一种客户端版本兼容的方法、装置及存储介质 | |
WO2019019668A1 (zh) | 应用程序启动方法、装置、计算机设备和存储介质 | |
CN110866198A (zh) | 静态资源缓存方法、系统、装置、计算机设备和存储介质 | |
CN109522500B (zh) | 网页显示方法、装置、终端和存储介质 | |
CN110365724B (zh) | 任务处理方法、装置及电子设备 | |
CN112162795B (zh) | 一种插件启动方法、装置、计算机设备和存储介质 | |
CN110765394A (zh) | so文件加载方法、装置、存储介质及终端设备 | |
CN106886422A (zh) | 软件升级方法及装置、电子设备 | |
CN113391874A (zh) | 一种虚拟机检测对抗方法、装置、电子设备及存储介质 | |
CN114328097A (zh) | 一种文件监控方法、装置、电子设备和存储介质 | |
CN112732312A (zh) | 用于更新应用程序的方法及装置、电子设备和介质 | |
CN114610446B (zh) | 一种自动注入探针的方法、装置及系统 | |
CN116069366A (zh) | 客户端应用程序更新方法及装置、存储介质及电子设备 | |
CN117193874A (zh) | 插件处理方法、装置、存储介质及电子设备 | |
CN112691382B (zh) | 资源处理方法、装置及计算机可读存储介质 | |
CN115729590A (zh) | 服务部署方法、装置、设备和计算机可读存储介质 | |
CN104978214B (zh) | 一种组件加载方法、装置及终端 | |
CN114579167A (zh) | 一种下载应用升级文件的方法、装置及存储介质 | |
CN107122164B (zh) | 函数地址获取及应用其的方法、装置、设备及存储介质 | |
JP7255681B2 (ja) | 実行制御システム、実行制御方法、及びプログラム | |
CN117879976B (zh) | 基于跨站脚本攻击的请求数据处理方法、计算机设备 | |
CN109918153B (zh) | 页面打开方法和装置、页面内容检索方法和装置 |
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 |