掌桥专利:专业的专利平台
掌桥专利
首页

动态修改业务数据逻辑方法、系统、计算机设备及介质

文献发布时间:2023-06-19 13:29:16


动态修改业务数据逻辑方法、系统、计算机设备及介质

技术领域

本发明属于计算机软件技术领域,尤其是一种动态修改业务数据逻辑方法、系统、计算机设备以及存储介质。

背景技术

JAR(Java ARchive,Java归档)是一种与平台无关的文件格式,可将多个文件合成一个文件。用户可将多个Java applet及其所需组件(class文件、图像和声音)绑定到JAR文件中,而后作为单个的简单HTTP(Hypertext Tranfer Protocal,超文本传输协议)事务下载到浏览器中,从而大大提高下载速度。JAR格式也支持压缩,从而减小了文件的大小,进一步缩短下载时间。

现有技术中,在基于底层封装JAR包的二次开发过程中,在底层默认实现无法适应下游业务的情况下,方法均是通过更改JAR包,修改默认实现逻辑满足业务要求;现有技术通过更改JAR包在一定程度上导致开发效率过低,并且占用较多的开发资源和算力资源,开发成本较高。

发明内容

有鉴于此,为至少部分解决上述技术问题之一,本发明实施例目的在于提供一种效率更高,占用开发资源更少的动态修改业务数据逻辑方法,同时本申请技术方案还提供能够对应实现该方法的系统、计算机设备以及存储介质。

第一方面,本申请的技术方案提供了动态修改业务数据逻辑方法,其步骤包括:

在本申请方案的一种可行的实施例中,获取文件包,标记所述文件包中的类别以及所述类别实例,确定所述实例的第一业务逻辑;

编译所述文件包中的类别得到标记类文件,编译所述第一业务逻辑得到定义类文件;

建立所述标记类文件与所述定义类文件的关联关系;

扫描所述定义类文件,根据所述关联关系以及第一代理接口的第二业务逻辑替换所述第一业务逻辑,通过初始化类定义替换所述类别实例。

在本申请方案的一种可行的实施例中,在通过初始化类定义替换所述类别实例这一步骤之前,所述方法包括:

创建钩子线程,确定所述钩子线程的业务逻辑替换流程;

生成所述钩子线程的第二代理接口,通过所述第二代理接口执行所述业务逻辑替换流程,所述业务逻辑替换流程用于以第二业务逻辑替换所述第一业务逻辑。

在本申请方案的一种可行的实施例中,所述根据所述关联关系将所述第一业务逻辑替换为第一代理接口的第二业务逻辑这一步骤,包括:

通过全局扫描获取所述定义类文件,根据所述关联关系确定得到所述标记类文件;

通过动态代理机制生成所述定义类文件的第一代理接口,根据所述第一代理接口的第二业务逻辑替换所述第一业务逻辑。

在本申请方案的一种可行的实施例中,所述通过初始化类定义替换所述类别实例这一步骤包括:

生成所述类别实例的类型定义描述;

通过重新定义接口初始化所述类型定义描述,得到目标类别实例,以所述目标类别实例替换所述类别实例。

在本申请方案的一种可行的实施例中,在所述扫描所述定义类文件这一步骤之前,所述方法还包括:构建启动类加载器,通过所述启动类加载器获取定义类文件的文件包以及配置信息。

在本申请方案的一种可行的实施例中,在所述获取文件包这一步骤之前,所述方法还包括:

获取内存空间,将所述内存空间划分为第一区域和第二区域;所述第一区域用于存储所述文件包的文件信息,所述第二区域用于存储所述类别实例;

创建类加载器,通过所述类加载器加载所述文件包中的类别以及所述类别实例。

第二方面,本发明的技术方案还提供动态修改业务数据逻辑系统,该系统包括:

数据获取模块,用于获取文件包,标记所述文件包中的类别以及所述类别实例,确定所述实例的第一业务逻辑;

文件编译模块,用于编译所述文件包中的类别得到标记类文件,编译所述第一业务逻辑得到定义类文件;

关系记录模块,用于建立所述标记类文件与所述定义类文件的关联关系;

业务逻辑替换模块,用于扫描所述定义类文件,根据所述关联关系以及第一代理接口的第二业务逻辑替换所述第一业务逻辑,通过初始化类定义替换所述类别实例。

在本申请方案的一种可行的实施例中,所述动态修改业务数据逻辑系统,还包括:虚拟机配置模块,用于获取内存空间,将所述内存空间划分为第一区域和第二区域;并创建类加载器,通过所述类加载器加载所述文件包中的类别以及所述类别实例;

所述第一区域用于存储所述文件包的文件信息,所述第二区域用于存储所述类别实例。

第三方面,本发明的技术方案还提供动态修改业务数据逻辑计算机设备,其包括:

至少一个处理器;

至少一个存储器,用于存储至少一个程序;

当至少一个程序被至少一个处理器执行,使得至少一个处理器运行第一方面中所述方法。

第四方面,本发明的技术方案还提供一种存储介质,其中存储有处理器可执行的程序,所述处理器可执行的程序在由处理器执行时用于运行如权利要求1-7中任一项所述动态修改业务数据逻辑方法。

本发明的优点和有益效果将在下面的描述中部分给出,其他部分可以通过本发明的具体实施方式了解得到:

本申请技术方案,首先确定需要进行替换的类别失灵以及业务逻辑,然后通过编译得到标记类文件以及定义类文件,通过两者之间的关联关系进行索引,将得到的定义类文件通过关联关系以及代理接口的业务逻辑替换原业务逻辑,通过初始化类定义替换类别实例,最终实现在二次开发中避免修改类库源代码的情况下修改业务的流程,从而提高了开发效率,减少开发资源和算力资源的占用,进而降低开发成本。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的动态修改业务数据逻辑方法的步骤流程图;

图2为本发明实施例通过钩子线程实现业务逻辑替换的步骤流程图。

具体实施方式

下面详细描述本发明的实施例,实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。对于以下实施例中的步骤编号,其仅为了便于阐述说明而设置,对步骤之间的顺序不做任何限定,实施例中的各步骤的执行顺序均可根据本领域技术人员的理解来进行适应性调整。

为了不更改底层JAR包也能修改默认实现逻辑满足业务要求,达到极大提升开发效率的目的,在第一方面,如图1所示,本申请的技术方案提供了动态修改业务数据逻辑方法,其主要步骤可以包括S100-S400:

S100、获取文件包,标记所述文件包中的类别以及所述类别实例,确定所述实例的第一业务逻辑;

其中,文件包是指实施例中的底层JAR包,类别是指JAR包中描述的二进制class类,类别实例是指class类中一个具体的实例方法。

需要说明的是,实施例中步骤描述以开发语言环境JAVA为例,本申请技术方案可以支持在其他任何编译成JVM字节码能运行在JVM上的开发语言,包括但不限于scala、jpython、kotlin、groovy以及jruby等。Java虚拟机(Java Virtual Machine,JVM)是一种用于计算设备的规范,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

具体地,在实施例中,首先标记需要替换的底层JAVA包中描述的二进制class类,和class类中一个具体的实例方法;并且定义描述的实例方法需替换的业务逻辑。

在一些可选择的实施例中,在所述获取文件包这一过程之前,方法还可以包括步骤S001-S002:

S001、获取内存空间,将所述内存空间划分为第一区域和第二区域;

其中,第一区域用于存储所述文件包的文件信息,所述第二区域用于存储所述类别实例。具体地,实施例中首先根据JVM内存配置要求,为JVM申请特定大小的内存空间;JVM启动时按照其配置要求,申请一部分内存,并根据JVM规范和实现将内存划分为几个区域。class二进制文件信息被放入方法区,即第一区域,对象实例被放入java堆,即第二区域。

S002、创建类加载器,通过所述类加载器加载所述文件包中的类别以及所述类别实例;

具体地,实施例在JVM申请内存空间后,在JVM中会创建一个引导类加载器(Bootstrap Classloader)实例,负责加载JVM虚拟机运行时所需的基本系统级别的类,例如java.lang.String、java.lang.Object等等;引导类加载器(Bootstrap Classloader)会读取{JRE_HOME}/lib下的JAR包和配置,然后将这些系统类加载到方法区内;引导类加载器将类信息加载到方法区中,以特定方式组织,对于某一个特定的类而言,在方法区中它应该有运行时常量池、类型信息、字段信息、方法信息、类加载器的引用,对应class实例的引用等信息。然后,实施例的JVM虚拟机调用已经加载在方法区的类sun.misc.Launcher的静态方法getLauncher(),获取sun.misc.Launcher实例。

S200、编译所述文件包中的类别得到标记类文件,编译所述第一业务逻辑得到定义类文件;

在实施例中,标记类文件是指编译S100中的标记类得到二进制class文件,定义类文件是指编译步骤S100中的定义类得到二进制class文件,其中标记类即指需要替换的底层JAR包中描述的二进制class类,定义类即指定义描述的实例方法需替换的业务逻辑的二进制class文件。

具体地,在实施例中可以通过launcher.getClassLoader()方法返回AppClassLoader实例,接着就是AppClassLoader加载定义类;实施例中,在org.luanlouis.jvm.load.Main类被编译成的class文件中存在一个叫常量池(ConstantPool)的结构体,通过这个常量池中的CONSTANT_CLASS_INFO常量判断该class用到了哪些类,并通过类加载器去加载这些类。

S300、建立所述标记类文件与所述定义类文件的关联关系;

具体地,实施例建立标记类与定义类的关联关系,实施例中可以采用代码注解定义,也可以在代码外部记录关系,包括但不限于文件、数据库等。

S400、扫描所述定义类文件,根据所述关联关系以及第一代理接口的第二业务逻辑替换所述第一业务逻辑,通过初始化类定义替换所述类别实例;

其中,实施例的第一代理接口是指代理类,需要说明的是,在实施例的应用场景中,使用一个类(通常是接口)A时,并不是直接使用这个类,而是通过另外一个类B去调用A的方法,这里的类B就是一个代理类。步骤S400中的第二业务逻辑即为需要替换得到的目标业务逻辑。

具体地,实施例在JVM加载S100和S200中的JAR包、标记类和定义类;然后,实施例启动运行类,在启动运行类启动时寻找上述步骤S100-S200中的二进制class程序,实现逻辑替换。

示例性地,实施例中,启动类加载器是使用C++语言实现的(HotSpot),负责加载JVM虚拟机运行时所需的基本系统级别的类,如java.lang.String,java.lang.Object等等。启动类加载器(Bootstrap Classloader)会读取{JRE_HOME}/lib下的jar包(如rt.jar)和配置,然后将这些系统类加载到方法区内。由于类加载器是使用平台相关的底层C/C++语言实现的,所以该加载器不能被Java代码访问到;但在实施例中可以查询某个类是否被引导类加载器加载过。

在一些可选择的实施例中,在方法通过初始化类定义替换所述类别实例之前,还可以包括步骤S310-S320:

S310、创建钩子线程,确定所述钩子线程的业务逻辑替换流程;

S320、生成所述钩子线程的第二代理接口,通过所述第二代理接口执行所述业务逻辑替换流程,所述业务逻辑替换流程用于以第二业务逻辑替换所述第一业务逻辑;

其中,钩子线程即指HOOK钩子类,当JVM进程退出的时候,或者受到了系统的中断信号,hook线程就会启动,一个线程可以注入多个钩子。步骤S320中,第二代理接口为钩子的代理类。

具体地,如图2所示,实施例中JVM运行加载class,然后再识别HOOK钩子类,获取钩子类的每一种方法的注解,获取替换的类与方法,然后通过Javassist为每一个钩子方法生成代理类;最后通过JVMTI生成新类逻辑,替换JVM里的原类,反射执行步骤S310-S320的钩子代理类逻辑。

在一些可选择的实施例中,步骤S400中根据所述关联关系将所述第一业务逻辑替换为第一代理接口的第二业务逻辑这一过程,可以包括步骤S410-S440:

S410、通过全局扫描获取所述定义类文件,根据所述关联关系确定得到所述标记类文件;

具体地,实施例首先扫描全局class文件确定步骤S100描述的定义类,确定在步骤S300中确定该类的管关系,得到的标记class。

S420、通过动态代理机制生成所述定义类文件的第一代理接口,根据所述第一代理接口的第二业务逻辑替换所述第一业务逻辑;

具体地,实施例通过动态代理机制在JVM中生成S200中的定义类的代理类,业务逻辑是执行S200定义类声明的业务逻辑;其中JAVA动态代理技术是指代理类在程序运行时才创建的代理方式,其具有两种常用实现,JDK动态代理和CGLIB动态代理。

S430、生成所述类别实例的类型定义描述;

具体地,实施例使用动态代理机制在JVM中生成标记类的实例,替换实例方法的逻辑为执行S420中的代理类的业务逻辑。

S440、通过重新定义接口初始化所述类型定义描述,得到目标类别实例,以所述目标类别实例替换所述类别实例;

具体地,实施例通过JVMTI技术提供的instrument机制生成步骤S430中实例的ClassDefinition,并且使用instrument的redefineClasses接口将生成的ClassDefinition实例初始化,并替代JVM中原标记类的实例。

在一些可选择的实施例中,方法在步骤S400扫描所述定义类文件这一过程之前,还可以包括步骤S330:

S330、构建启动类加载器,通过所述启动类加载器获取定义类文件的文件包以及配置信息;

具体地,实施例可以定义启动运行类,在启动运行类启动时寻找上述步骤描述的二进制class程序,实现逻辑替换。

第二方面,本发明的技术方案还提供一种动态修改业务数据逻辑系统,该系统包括:

数据获取模块,用于获取文件包,标记所述文件包中的类别以及所述类别实例,确定所述实例的第一业务逻辑;

文件编译模块,用于编译所述文件包中的类别得到标记类文件,编译所述第一业务逻辑得到定义类文件;

关系记录模块,用于建立所述标记类文件与所述定义类文件的关联关系;

业务逻辑替换模块,用于扫描所述定义类文件,根据所述关联关系以及第一代理接口的第二业务逻辑替换所述第一业务逻辑,通过初始化类定义替换所述类别实例。

在一些可选择的实施例中,实施例的动态修改业务数据逻辑系统,该系统还可以包括虚拟机配置模块,该虚拟机配置模块可以用于获取内存空间,将所述内存空间划分为第一区域和第二区域;并创建类加载器,通过所述类加载器加载所述文件包中的类别以及所述类别实例;其中,第一区域用于存储所述文件包的文件信息,所述第二区域用于存储所述类别实例。

第三方面,本申请的实施例提供了一种动态修改业务数据逻辑计算机设备,其包括:至少一个处理器;至少一个存储器,用于存储至少一个程序;当至少一个程序被至少一个处理器执行,使得至少一个处理器运行第一方面中方法。

从上述具体的实施过程,可以总结出,本发明所提供的技术方案相较于现有技术存在以下优点或优势:

本申请技术方案实现了在二次开发中避免修改类库源代码的情况下修改业务的流程,从而提高了开发效率,减少开发资源和算力资源的占用,进而降低开发成本。

在一些可选择的实施例中,在方框图中提到的功能/操作可以不按照操作示图提到的顺序发生。例如,取决于所涉及的功能/操作,连续示出的两个方框实际上可以被大体上同时地执行或所述方框有时能以相反顺序被执行。此外,在本发明的流程图中所呈现和描述的实施例以示例的方式被提供,目的在于提供对技术更全面的理解。所公开的方法不限于本文所呈现的操作和逻辑流程。可选择的实施例是可预期的,其中各种操作的顺序被改变以及其中被描述为较大操作的一部分的子操作被独立地执行。

此外,虽然在功能性模块的背景下描述了本发明,但应当理解的是,除非另有相反说明,功能和/或特征中的一个或多个可以被集成在单个物理装置和/或软件模块中,或者一个或多个功能和/或特征可以在单独的物理装置或软件模块中被实现。还可以理解的是,有关每个模块的实际实现的详细讨论对于理解本发明是不必要的。更确切地说,考虑到在本文中公开的装置中各种功能模块的属性、功能和内部关系的情况下,在工程师的常规技术内将会了解该模块的实际实现。因此,本领域技术人员运用普通技术就能够在无需过度试验的情况下实现在权利要求书中所阐明的本发明。还可以理解的是,所公开的特定概念仅仅是说明性的,并不意在限制本发明的范围,本发明的范围由所附权利要求书及其等同方案的全部范围来决定。

在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。

在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。

尽管已经示出和描述了本发明的实施例,本领域的普通技术人员可以理解:在不脱离本发明的原理和宗旨的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由权利要求及其等同物限定。

以上是对本发明的较佳实施进行了具体说明,但本发明并不限于上述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做作出种种的等同变形或替换,这些等同的变形或替换均包含在本申请权利要求所限定的范围内。

相关技术
  • 动态修改业务数据逻辑方法、系统、计算机设备及介质
  • 一种业务数据导入导出方法、系统、计算机设备及介质
技术分类

06120113694000