Java类中方法的替换方法和装置与流程

文档序号:12786041阅读:716来源:国知局
Java类中方法的替换方法和装置与流程

本申请涉及软件技术领域,尤其涉及一种Java类中方法的替换方法和装置。



背景技术:

Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言,Java技术具有卓越的通用性、高效性、平台移植性以及安全性,目前已被广泛使用在各个领域的不同平台。

Java类是Java程序的组织单位,Java类中通常封装有方法,然而,Java类不能被直接操作,通常需要由Java虚拟机对Java类进行加载,然后执行Java类中的各个方法,以实现Java程序的运行。

在实际的应用开发中,经常需要对Java类中的方法进行修改,目前,在对Java类中的方法进行修改时,普遍需要重新启动相关的应用,从而降低修改效率。同时,一旦Java程序已经发布给用户,用户需要更新并重新启动相关的应用才能达到修改Java类中方法的目的,降低了用户体验。



技术实现要素:

有鉴于此,本申请提供一种Java类中方法的替换方法和装置,以解决相关技术中替换Java类中方法需要重新启动相关应用的问题。

具体地,本申请是通过如下技术方案实现的:

一种Java类中方法的替换方法,所述方法包括:

Java虚拟机加载第一Java类以及第二Java类;

通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息;

根据所述第二结构信息替换所述第一结构信息。

可选的,所述通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息,包括:

确定所述Java虚拟机类型和版本;

根据所述Java虚拟机类型和版本,通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息。

可选的,所述第一结构信息包括所述待替换方法的第一属性参数及其第一地址信息;

所述第二结构信息包括所述替换方法的第二属性参数及其第二地址信息。

可选的,所述通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息,包括:

根据所述待替换方法的第一标识,通过JNI获取所述第一结构信息中的第一地址信息,并根据所述第一地址信息查找所述第一结构信息中的第一属性参数;

根据所述替换方法的第二标识,通过JNI获取所述第二结构信息中的第二地址信息,并根据所述第二地址信息查找所述第二结构信息中的第二属性参数。

可选的,所述根据所述第二结构信息替换所述第一结构信息,包括:

将所述第一属性参数对应替换为所述第二属性参数。

一种Java类中方法的替换装置,所述装置包括:

类加载单元,Java虚拟机加载第一Java类以及第二Java类;

结构确定单元,通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息;;

结构替换单元,根据所述第二结构信息替换所述第一结构信息。

可选的,所述结构确定单元,具体确定所述Java虚拟机类型和版本;

根据所述Java虚拟机类型和版本,通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息。

可选的,所述第一结构信息包括所述待替换方法的第一属性参数及其第一地址信息;

所述第二结构信息包括所述替换方法的第二属性参数及其第二地址信息。

可选的,所述结构确定单元,具体根据所述待替换方法的第一标识,通过JNI获取所述第一结构信息中的第一地址信息,并根据所述第一地址信息查找所述第一结构信息中的第一属性参数;

根据所述替换方法的第二标识,通过JNI获取所述第二结构信息中的第二地址信息,并根据所述第二地址信息查找所述第二结构信息中的第二属性参数。

可选的,所述结构替换单元,具体将所述第一属性参数对应替换为所述第二属性参数。

由以上描述可以看出,本申请在Java虚拟机加载第一Java类以及第二Java类后,可以通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息,并根据所述第二结构信息替换所述第一结构信息,以使得后续在对所述第一Java类中的待替换方法调用执行时,可以调用到所述替换方法上,以实现对各个类型Java类中方法的动态替换,无需重新启动相关应用,也无需重新加载Java类,提高了Java类中方法替换的效率,同时提升了用户体验。

附图说明

图1是本申请一示例性实施例示出的一种Java类中方法的替换方法的流程示意图。

图2是本申请一示例性实施例示出的另一种Java类中方法的替换方法的流程示意图。

图3是本申请一示例性实施例示出的一种用于Java类中方法的替换装置 的一结构示意图。

图4是本申请一示例性实施例示出的一种Java类中方法的替换装置的结构示意图。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。

在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

在相关技术中,以Android应用开发为例,为解决替换Java类中方法需要重新启动相关应用的问题,可以使用Classloader(类加载器)来加载Java类,当需要替换Java类中方法的时候,可以创建新的Classloader来重新加载新的Java类,以达到替换Java类中方法的目的。然而,在这样的实现方案中,需要重新对Java类进行加载,替换Java类中方法的效率较低。

此外,针对接口类型的Java类,还可以通过Java的代理类来实现Java 类中方法的替换,然而,Java类的代理类只能实现接口类型的Java类中方法的替换,针对其他类型的Java类,则无法实现。

针对上述问题,本申请提供一种Java类中方法的替换方案,在替换Java类中方法时,无需重新启动相关应用,提升Java类中方法替换的效率,同时提升用户体验。

图1是本申请一示例性实施例示出的一种Java类中方法的替换方法的流程示意图。

请参考图1,所述Java类中方法的替换方法可以应用在终端中,包括有以下步骤:

步骤101,Java虚拟机加载第一Java类以及第二Java类。

在本实施例中,将包括有待替换方法的Java类称为第一Java类,将包括有替换方法的Java类称为第二Java类。在进行Java类中方法的替换时,需要将所述第一Java类中的待替换方法替换为所述第二Java类中的替换方法。

在本步骤中,Java虚拟机可以加载所述第一Java类以及所述第二Java类。

步骤102,通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息。

基于前述步骤101,Java虚拟机在加载所述第一Java类以及所述第二Java类之后,可以通过JNI(Java Native Interface,Java本地接口)确定所述第一Java类中所述待替换方法的第一结构信息,以及确定所述第二Java类中所述替换方法的第二结构信息。

其中,所述第一结构信息包括所述待替换方法的第一属性参数及其第一地址信息,所述第二结构信息包括所述替换方法的第二属性参数及其第二地址信息。在本步骤中,可以通过所述待替换方法的第一标识通过JNI获取所述第一结构信息中的第一地址信息,并根据所述第一地址信息查找所述第一结构信息中的第一属性参数。同意,可以根据所述替换方法的第二标识,通 过JNI获取所述第二结构信息中的第二地址信息,并根据所述第二地址信息查找所述第二结构信息中的第二属性参数。

步骤103,根据所述第二结构信息替换所述第一结构信息。

基于前述步骤102,在确定所述第一结构信息以及所述第二结构信息之后,可以根据所述第二结构信息替换所述第一结构信息,比如:将所述第一结构信息中的所述第一属性参数对应替换为所述第二结构信息中的所述第二属性参数,以实现将所述待替换方法替换为所述替换方法的目的。

由以上描述可以看出,本申请在Java虚拟机加载第一Java类以及第二Java类后,可以通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息,并根据所述第二结构信息替换所述第一结构信息,以使得后续在对所述第一Java类中的待替换方法调用执行时,可以调用到所述替换方法上,以实现对各个类型Java类中方法的动态替换,无需重新启动相关应用,也无需重新加载Java类,提高了Java类中方法替换的效率,同时提升了用户体验。

下面结合具体的实施方式来描述本申请的实现过程。

图2是本申请一示例性实施例示出的另一种Java类中方法的替换方法的流程示意图。

请参考图2,所述Java类中方法的替换方法可以应用在终端中,包括有以下步骤:

步骤201,Java虚拟机加载第一Java类以及第二Java类。

为便于描述,可以将包括有待替换方法的Java类称为第一Java类,将包括有替换方法的Java类称为第二Java类,即,所述第一Java类中包括有待替换方法,所述第二Java类中包括有替换方法。在本实施例中,需要将所述待替换方法替换为所述替换方法。

在本步骤中,Java虚拟机可以分别加载所述第一Java类以及所述第二Java类。

步骤202,根据所述第一Java类中待替换方法的第一标识,通过JNI获 取所述待替换方法的第一结构信息中的第一地址信息。

在本实施例中,所述第一标识用于标识所述待替换方法,所述第一标识可以为所述待替换方法的名称、ID等信息。所述第一结构信息为所述Java虚拟机在加载所述第一Java类后,所述待替换方法在所述Java虚拟机中的结构信息,所述第一结构信息可以包括:所述待替换方法的属性参数以及所述属性参数的地址信息,在本实施例中,可以将所述待替换方法的属性参数称为第一属性参数,将所述第一属性参数的位置信息称为第一地址信息。JNI为Java本地接口,通过JNI可以操作Java虚拟机。

在本实施例中,可以根据指定的第一标识,通过JNI获取所述第一结构信息中的第一地址信息,所述第一地址信息可以为内存地址,所述内存地址中存储有所述第一属性参数。

步骤203,根据所述第一地址信息查找所述第一结构信息中的第一属性参数。

基于前述步骤202,在获取到所述第一地址信息之后,可以根据所述第一地址信息查找存储的第一属性参数。所述第一属性参数可以包括:所述待替换方法的名称、入口信息以及出口信息等信息。

步骤204,根据所述第二Java类中替换方法的第二标识,通过JNI获取所述替换方法的第二结构信息中的第二地址信息。

在本实施例中,与所述第一标识类似,所述第二标识用于标识所述替换方法,所述第二标识可以为所述替换方法的名称、ID等信息。所述第二结构信息为所述Java虚拟机在加载所述第二Java类后,所述替换方法在所述Java虚拟机中的结构信息。所述第二结构信息可以包括:所述替换方法的属性参数以及所述属性参数的地址信息,在本实施例中,可以将所述替换方法的属性参数称为第二属性参数,将所述第二属性参数的位置信息称为第二地址信息。

在本实施例中,可以根据指定的第二标识,通过JNI获取所述第二结构信息中的第二地址信息,所述第二地址信息也可以为内存地址,该内存地址 中存储有所述第二属性参数。

步骤205,根据所述第二地址信息查找所述第二结构信息中的第二属性参数。

基于前述步骤204,在获取到所述第二地址信息之后,可以根据所述第二地址信息查找存储的第二属性参数。所述第二属性参数可以包括:所述替换方法的名称、入口信息以及出口信息等信息。

步骤206,将所述第一属性参数对应替换为所述第二属性参数。

基于前述步骤203以及步骤205,在查找到所述第一属性参数以及所述第二属性参数之后,在本步骤中,可以将所述第一属性参数对应替换为所述第二属性参数。比如:将所述第一属性参数中的名称替换为所述第二属性参数中的名称,将所述第一属性参数中的入口信息替换为所述第二属性参数中的入口信息等。由于所述待替换方法的属性信息已经被替换为所述替换方法的属性信息,所以后续在调用执行时所述待替换方法时,将会调用执行所述替换方法,实现了Java类中方法的动态替换。采用本申请提供的Java类中方法的替换方案,在将应用发布给用户后,仍可以实时、对用户无感知地替换Java类中的方法,提升了用户的使用体验。

由以上描述可以看出,本申请在Java虚拟机加载第一Java类以及第二Java类后,可以通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息,并根据所述第二结构信息替换所述第一结构信息,以使得后续在对所述第一Java类中的待替换方法调用执行时,可以调用到所述替换方法上,以实现对各个类型Java类中方法的动态替换,无需重新启动相关应用,也无需重新加载Java类,提高了Java类中方法替换的效率,同时提升了用户体验。

可选的,在本申请另一实施例中,可以在初始化时,先确定Java虚拟机的类型和版本,然后在确定所述第一结构信息以及所述第二结构信息时,可以根据所述Java虚拟机的类型和版本确定所述第一结构信息以及所述第二结构信息。这是因为,不同类型的Java虚拟机,加载Java类之后,Java类 中方法的结构信息可能有所不同,而相同类型的Java虚拟机,加载Java类之后,Java类中方法的结构信息也可能有所不同。因此,根据所述Java虚拟机的类型和版本确定出准确的第一结构信息以及第二结构信息。

与前述Java类中方法的替换方法的实施例相对应,本申请还提供了Java类中方法的替换装置的实施例。

本申请Java类中方法的替换装置的实施例可以应用在终端上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在终端的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图3所示,为本申请Java类中方法的替换装置所在终端的一种硬件结构图,除了图3所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的终端通常根据该终端的实际功能,还可以包括其他硬件,对此不再赘述。

图4是本申请一示例性实施例示出的一种Java类中方法的替换装置的结构示意图。

请参考图4,所述Java类中方法的替换装置300可以应用在图3所示的终端中,包括有:类加载单元301、结构确定单元302以及结构替换单元303。

其中,所述类加载单元301,Java虚拟机加载第一Java类以及第二Java类;

所述结构确定单元302,通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息;;

所述结构替换单元303,根据所述第二结构信息替换所述第一结构信息。

可选的,所述结构确定单元302,具体确定所述Java虚拟机类型和版本;

根据所述Java虚拟机类型和版本,通过JNI确定所述第一Java类中待替换方法的第一结构信息以及所述第二Java类中替换方法的第二结构信息。

可选的,所述第一结构信息包括所述待替换方法的第一属性参数及其第一地址信息;

所述第二结构信息包括所述替换方法的第二属性参数及其第二地址信息。

可选的,所述结构确定单元302,具体根据所述待替换方法的第一标识,通过JNI获取所述第一结构信息中的第一地址信息,并根据所述第一地址信息查找所述第一结构信息中的第一属性参数;

根据所述替换方法的第二标识,通过JNI获取所述第二结构信息中的第二地址信息,并根据所述第二地址信息查找所述第二结构信息中的第二属性参数。

可选的,所述结构替换单元303,具体将所述第一属性参数对应替换为所述第二属性参数。

上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。

对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1