CN109710428A - 一种实现类的动态调用方法及装置 - Google Patents
一种实现类的动态调用方法及装置 Download PDFInfo
- Publication number
- CN109710428A CN109710428A CN201811608558.2A CN201811608558A CN109710428A CN 109710428 A CN109710428 A CN 109710428A CN 201811608558 A CN201811608558 A CN 201811608558A CN 109710428 A CN109710428 A CN 109710428A
- Authority
- CN
- China
- Prior art keywords
- class
- interface
- realization
- loader
- target
- 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.)
- Granted
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本公开提供了一种实现类的动态调用方法及装置,其中,所述方法包括:检测当前接口是否属于目标类接口;所述目标类接口是插件式且需要动态调用相应的实现类的接口;如果所述当前接口属于目标类接口,则检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器;所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类;如果所述接口加载器中已缓存了所述目标扩展服务加载器,则通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。本公开实现了动态调用插件式接口的实现类的目的。
Description
技术领域
本公开涉及网络技术领域,尤其涉及一种实现类的动态调用方法及装置。
背景技术
接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合,通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
从实现类可以很容易的获得对应的接口,但想要通过接口知道它有哪些实现类并找到某个具体实现类却很难。
发明内容
有鉴于此,本公开提供了一种实现类的动态调用方法及装置,以解决相关技术中的不足。
根据本公开实施例的第一方面,提供一种实现类的动态调用方法,所述方法包括:
检测当前接口是否属于目标类接口;所述目标类接口是插件式且需要动态调用相应的实现类的接口;
如果所述当前接口属于目标类接口,则检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器;所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类;
如果所述接口加载器中已缓存了所述目标扩展服务加载器,则通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。
可选地,所述检测当前接口是否属于目标类接口,包括:
检测所述当前接口是否包括目标接口注解,所述目标接口注解用于标识需要动态调用相应的实现类的接口。
可选地,所述在所述当前接口所对应的实现类中确定目标实现类,包括:
在所述当前接口所对应的实现类中,根据所述当前业务对应的实现类名称确定所述目标实现类。
可选地,所述方法还包括:
如果所述接口加载器中未缓存所述目标扩展服务加载器,则创建所述目标扩展服务加载器对应的目标对象;所述目标对象包括所述当前接口和所述当前接口所对应的实现类;
缓存所述目标对象到所述接口加载器中;
在缓存所述目标对象到所述接口加载器中之后,执行所述通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类的步骤。
可选地,所述创建所述目标扩展服务加载器对应的目标对象,包括:
在所述接口加载器的目标扩展服务加载器函数中保存所述当前接口的定义;所述目标扩展服务器加载函数是与所述目标扩展服务加载器对应的函数;
通过所述目标扩展服务加载器函数,加载所述当前接口对应的所有实现类;
从spring容器中获取所述所有实现类中满足预设条件的实现类的实例;
将从spring容器中获取的所述实例加入实例加载器的缓存中。
可选地,所述加载所述当前接口对应的所有实现类,包括:
加载预设目录下的所有文件;
对所述预设目录下的所有文件进行遍历,逐行读取每个文件中所包括的实现类。
可选地,所述预设条件包括:
添加了目标实现类注解且属于用于实现所述当前接口的类;所述目标实现类注解用于标识需要动态调用的实现类。
根据本公开实施例的第二方面,提供一种实现类的动态调用装置,所述装置包括:
第一检测模块,被配置为检测当前接口是否属于目标类接口;所述目标类接口是插件式且需要动态调用相应的实现类的接口;
第二检测模块,被配置为如果所述当前接口属于目标类接口,则检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器;所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类;
动态调用模块,被配置为如果所述接口加载器中已缓存了所述目标扩展服务加载器,则通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。
可选地,所述第一检测模块包括:
检测子模块,被配置为检测所述当前接口是否包括目标接口注解,所述目标接口注解用于标识需要动态调用相应的实现类的接口。
可选地,所述动态调用模块包括:
确定子模块,被配置为在所述当前接口所对应的实现类中,根据所述当前业务对应的实现类名称确定所述目标实现类。
可选地,所述装置还包括:
对象创建模块,被配置为如果所述接口加载器中未缓存所述目标扩展服务加载器,则创建所述目标扩展服务加载器对应的目标对象;所述目标对象包括所述当前接口和所述当前接口所对应的实现类;
缓存模块,被配置为缓存所述目标对象到所述接口加载器中;
控制模块,被配置为在缓存所述目标对象到所述接口加载器中之后,控制所述动态调用模块通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类。
可选地,所述对象创建模块包括:
保存子模块,被配置为在所述接口加载器的目标扩展服务加载器函数中保存所述当前接口的定义;所述目标扩展服务器加载函数是与所述目标扩展服务加载器对应的函数;
加载子模块,被配置为通过所述目标扩展服务加载器函数,加载所述当前接口对应的所有实现类;
实例获取子模块,被配置为从spring容器中获取所述所有实现类中满足预设条件的实现类的实例;
实例添加子模块,被配置为将从spring容器中获取的所述实例加入实例加载器的缓存中。
可选地,所述加载子模块包括:
加载单元,被配置为加载预设目录下的所有文件;
读取单元,被配置为对所述预设目录下的所有文件进行遍历,逐行读取每个文件中所包括的实现类。
可选地,所述预设条件包括:
添加了目标实现类注解且属于用于实现所述当前接口的类;所述目标实现类注解用于标识需要动态调用的实现类。
根据本公开实施例的第三方面,提供一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序用于执行上述第一方面所述的实现类的动态调用方法。
根据本公开实施例的第四方面,提供一种实现类的动态调用装置,所述装置包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为:
检测当前接口是否属于目标类接口;所述目标类接口是插件式且需要动态调用相应的实现类的接口;
如果所述当前接口属于目标类接口,则检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器;所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类;
如果所述接口加载器中已缓存了所述目标扩展服务加载器,则通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。
本公开的实施例提供的技术方案可以包括以下有益效果:
本公开实施例中,可以在当前接口属于目标类接口时,即当前接口是插件式且需要动态调用相应的实现类的接口时,检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器,其中,所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类。如果所述接口加载器中已缓存了所述目标扩展服务加载器,则可以直接通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。通过上述过程,实现了动态调用插件式接口的实现类的目的。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
图1是本公开根据一示例性实施例示出的一种实现类的动态调用方法流程图;
图2是本公开根据一示例性实施例示出的另一种实现类的动态调用方法流程图;
图3是本公开根据一示例性实施例示出的另一种实现类的动态调用方法流程图;
图4是本公开根据一示例性实施例示出的另一种实现类的动态调用方法流程图;
图5是本公开根据一示例性实施例示出的一种实现类的动态调用装置框图;
图6是本公开根据一示例性实施例示出的另一种实现类的动态调用装置框图;
图7是本公开根据一示例性实施例示出的另一种实现类的动态调用装置框图;
图8是本公开根据一示例性实施例示出的另一种实现类的动态调用装置框图;
图9是本公开根据一示例性实施例示出的另一种实现类的动态调用装置框图;
图10是本公开根据一示例性实施例示出的另一种实现类的动态调用装置框图;
图11是本公开根据一示例性实施例示出的一种用于实现类的动态调用装置的一结构示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
在本公开运行的术语是仅仅出于描述特定实施例的目的,而非旨在限制本公开。在本公开和所附权利要求书中所运行的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中运行的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本公开范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所运行的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
相关技术中,可以采用以下方式中的任意一种来实现动态调用接口对应的实现类。
第一种方式,使用spring容器。
这种技术方案可以实现动态调用一个接口对应的多个实现类,在一个应用内部使用是非常便捷的方式。但是在某些业务场景下,例如需要由代理商提供接口,并且要求该接口是插件式的,可以随意插入或移除时,就无法实现了。
第二种方式,使用SPI(Service Provider Interface,服务提供接口)。
这种技术方案可以方便的实现动态调用接口对应的实现类,且这个实现类是插件式的,可以随意插拔更换。
但在实现的过程中只能通过遍历所有实现类来获取需要的实现类,即将接口的实现类全部加载并实例化一遍,而且只能通过Iterator(迭代)形式获取,不能根据某个参数来获取需要的实现类。因此想要实现动态调用所需的实现类时,就必须每次遍历所有实现类,执行效率低下。
为了解决上述问题,实现动态调用插件式接口的实现类的目的,本公开实施例提供了一种实现类的动态调用方法。本公开实施例提供的实现类的动态调用方法可以用于云平台,或其他承载了spring容器、且可以运行java语言的平台。如图1所示,图1是根据一示例性实施例示出的一种实现类的动态调用方法,包括以下步骤:
在步骤101中,检测当前接口是否属于目标类接口;所述目标类接口是插件式且需要动态调用相应的实现类的接口;
在步骤102中,如果所述当前接口属于目标类接口,则检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器;所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类;
在步骤103中,如果所述接口加载器中已缓存了所述目标扩展服务加载器,则通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。
上述实施例中,可以在当前接口属于目标类接口时,即当前接口是插件式且需要动态调用相应的实现类的接口时,检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器,其中,所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类。如果所述接口加载器中已缓存了所述目标扩展服务加载器,则可以直接通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。通过上述过程,实现了动态调用插件式接口的实现类的目的。
针对上述步骤101,云平台可以在实现某个具体业务时,先检测该业务的当前接口是否属于目标类接口。其中,所述目标类接口是插件式接口,例如由运营商提供的外部接口,且所述目标类接口还是需要动态调用相应的实现类的接口。
可选地,在本公开实施例中,云平台可以检测当前接口是否添加了目标接口注解,例如@SPI注解,如果当前接口添加了所述目标接口注解,则可以确定所述当前接口属于目标类接口,云平台后续可以使用SPI来动态调用当前接口所对应的实现类。
针对上述步骤102,如果检测到所述当前接口属于目标类接口,则可以继续检测接口加载器中是否缓存了目标扩展服务加载器。
相关技术中的service loader(服务加载器)需要遍历一个接口对应的所有实现类才能确定当前业务所对应的实现类,在本公开实施例中,可以提供目标扩展服务加载器,来动态调用当前接口对应的实现类。
在本步骤中,云平台可以先检测接口加载器中是否缓存了所述目标扩展服务加载器。如果之前加载过当前接口,则接口加载器中就已经缓存了所述目标扩展服务加载器。
针对上述步骤103,如果所述接口加载器中已缓存了所述目标扩展服务加载器,那么云平台可以直接通过所述目标扩展服务加载器来加载所述当前接口,进一步地,可以通过当前业务对应的实现类名称在当前接口对应的实现类中,查找到目标实现类,直接调用所述目标实现类即可,无需遍历所述当前接口对应的所有实现类。
对上述实施例进一步举例说明如下。
例如,当前业务是手机充值合约业务,用户输入手机号并选定一个合约下单,云平台会自动调用正确的运营商或代理商的签约程序,从而完成合约的办理。
在业务架构中,手机充值合约这一环节只会被设计成一个接口,那么就需要实现通过接口动态调用不同的实现类去完成合约。本公开实施例中,合约标识直接绑定了业务模式,该业务模式可以作为所述实现类名称,如果所述接口加载器中已缓存了当前接口对应的目标扩展服务加载器,则可以通过目标扩展服务加载器,在当前接口对应的实现类中根据所述实现类名称,查找到可以实现该合约业务的目标实现类,动态调用目标实现类,最终完成手机充值合约业务。
在一实施例中,如图2所示,图2是在前述图1所示实施例的基础上示出的另一种实现类的动态调用方法,上述方法还可以包括以下步骤:
在步骤104中,如果所述接口加载器中未缓存所述目标扩展服务加载器,则创建所述目标扩展服务加载器对应的目标对象;
本公开实施例中,如果所述接口加载器中未缓存所述目标扩展服务加载器,说明这是首次加载当前接口,为了便于下次调用当前接口时,可以快速调用当前接口对应的实现类,则可以在接口加载器中缓存所述目标对象,所述目标对象包括所述当前接口和所述当前接口所对应的实现类。
本步骤中,需要先创建所述目标对象,创建所述目标对象的过程会在下面的实施例中进行介绍。
在步骤105中,缓存所述目标对象到所述接口加载器中;
本步骤中,云平台可以在创建了所述目标对象后,将所述目标对象即所述当前接口和所述当前接口对应的实现类缓存到所述接口加载器中,便于下次快速调用。
云平台在已经创建了目标对象并缓存了目标对象到接口加载器之后,就可以通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类。
上述实施例中,在首次加载当前接口时,同样实现了动态调用当前接口对应的实现类的目的,且可以提高下次动态调用当前接口对应的实现类的效率,可用性高。
在一实施例中,如图3所示,图3是在前述图2所示实施例的基础上示出的另一种实现类的动态调用方法,上述步骤104创建所述目标扩展服务加载器对应的目标对象的过程可以包括以下步骤:
在步骤104-1中,在所述接口加载器的目标扩展服务加载器函数中保存所述当前接口的定义;
本步骤中,云平台可以采用创建目标扩展服务加载器函数,即与所述目标扩展服务器对应的扩展服务加载器函数,在新创建的目标扩展服务加载器函数中保存所述当前接口的定义。
在步骤104-2中,通过所述目标扩展服务加载器函数,加载所述当前接口对应的所有实现类;
本步骤中,云平台可以通过所述目标扩展服务加载器函数,加载预设目录,例如META-INF/services/目录下的所有文件,进而遍历所述预设目录下的所有文件,逐行读取每个文件中所包括的实现类,得到当前接口对应的每个实现类的类定义。
在步骤104-3中,从spring容器中获取所述所有实现类中满足预设条件的实现类的实例;
在本公开实施例中,预设条件包括添加了目标实现类注解且属于用于实现所述当前接口的类;所述目标实现类注解用于标识需要从spring容器中动态调用的实现类。
本步骤中,云平台在根据上述步骤104-2得到了与当前接口对应的每个实现类的类定义之后,需要分别判断每个实现类是否满足上述的预设条件。即需要分别判断每个实现类是否添加了所述目标实现类注解,例如@Component注解,添加了所述目标实现类注解的实现类后续可以进行动态调用。
另外,为了避免出现编码错误,还需要判断每个实现类是否属于用于实现所述当前接口的类,例如当前接口是用于实现买书这一业务的接口,则当前接口对应的所有实现类均应该可以实现买书这一业务。如果有编码错误,则可能导致某个实现类无法实现上述业务,因此,本公开实施例中,还需要判断每个实现类是否属于用于实现所述当前接口的类。
本步骤中,云平台从spring容器中只获取满足预设条件的实现类的实例。如果检测到不满足所述预设条件的实现类,则可以打印error。
在步骤104-4中,将从spring容器中获取的所述实例加入实例加载器的缓存中。
本步骤中,云平台可以将从spring容器中获取的所述实例加入到实例加载器中,便于下次快速调用当前接口对应的实现类。
上述实施例中,可以在首次加载当前接口时,创建目标扩展服务加载器对应的目标对象,便于下次加载当前接口时,可以提高动态调用当前接口对应的实现类的效率。实现简便,可用性高。
在一实施例中,如图4所示,图4是根据一示例性实施例示出的一种实现类的动态调用方法,包括以下步骤:
在步骤201中,检测当前接口是否属于目标类接口。
其中,所述目标类接口是插件式且需要动态调用相应的实现类的接口。
在步骤202中,如果所述当前接口属于目标类接口,则检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器。
所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类。
如果接口加载器中未缓存与所述当前接口对应的目标扩展服务加载器,则执行步骤203,如果接口加载器中缓存了与所述当前接口对应的目标扩展服务加载器,则直接执行步骤208。
在步骤203,在所述接口加载器的目标扩展服务加载器函数中保存所述当前接口的定义。
在步骤204中,加载预设目录下的所有文件;
在步骤205中,对所述预设目录下的所有文件进行遍历,逐行读取每个文件中所包括的实现类。
在步骤206中,从spring容器中获取所有实现类中满足预设条件的实现类的实例。
其中,所述预设条件包括添加了目标实现类注解且属于用于实现所述当前接口的类;所述目标实现类注解用于标识需要动态调用的实现类。
在步骤207中,将从spring容器中获取的所述实例加入实例加载器的缓存中。
在步骤208中,通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中,根据所述当前业务对应的实现类名称确定目标实现类,并调用所述目标实现类。
其中,所述目标实现类是用于实现当前业务的实现类。
上述实施例中,如果是首次加载当前接口,则可以将当前接口和当前接口对应的实现类作为目标对象,缓存在接口加载器中,便于提高下次动态调用当前接口的实现类的效率。在将所述目标对象缓存到所述接口加载器中之后,或者接口加载器中已经缓存了与所述当前接口对应的目标扩展服务加载器时,可以通过目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。通过上述过程,将spring容器和SPI技术结合在一起,实现了动态调用插件式接口的实现类的目的,执行效率高。
与前述方法实施例相对应,本公开还提供了装置的实施例。
如图5所示,图5是本公开根据一示例性实施例示出的一种实现类的动态调用装置框图,所述装置包括:
第一检测模块310,被配置为检测当前接口是否属于目标类接口;所述目标类接口是插件式且需要动态调用相应的实现类的接口;
第二检测模块320,被配置为如果所述当前接口属于目标类接口,则检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器;所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类;
动态调用模块330,被配置为如果所述接口加载器中已缓存了所述目标扩展服务加载器,则通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。
如图6所示,图6本公开根据一示例性实施例示出的另一种实现类的动态调用装置框图,该实施例在前述图5实施例的基础上,所述第一检测模块310包括:
检测子模块311,被配置为检测所述当前接口是否包括目标接口注解,所述目标接口注解用于标识需要动态调用相应的实现类的接口。
如图7所示,图7本公开根据一示例性实施例示出的另一种实现类的动态调用装置框图,该实施例在前述图5实施例的基础上,所述动态调用模块330包括:
确定子模块331,被配置为在所述当前接口所对应的实现类中,根据所述当前业务对应的实现类名称确定所述目标实现类。
如图8所示,图8本公开根据一示例性实施例示出的另一种实现类的动态调用装置框图,该实施例在前述图5实施例的基础上,所述装置还包括:
对象创建模块340,被配置为如果所述接口加载器中未缓存所述目标扩展服务加载器,则创建所述目标扩展服务加载器对应的目标对象;所述目标对象包括所述当前接口和所述当前接口所对应的实现类;
缓存模块350,被配置为缓存所述目标对象到所述接口加载器中;
控制模块360,被配置为在缓存所述目标对象到所述接口加载器中之后,控制所述动态调用模块330通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类。
如图9所示,图9本公开根据一示例性实施例示出的另一种实现类的动态调用装置框图,该实施例在前述图8实施例的基础上,所述对象创建模块340包括:
保存子模块341,被配置为在所述接口加载器的目标扩展服务加载器函数中保存所述当前接口的定义;所述目标扩展服务器加载函数是与所述目标扩展服务加载器对应的函数;
加载子模块342,被配置为通过所述目标扩展服务加载器函数,加载所述当前接口对应的所有实现类;
实例获取子模块343,被配置为从spring容器中获取所述所有实现类中满足预设条件的实现类的实例;
实例添加子模块344,被配置为将从spring容器中获取的所述实例加入实例加载器的缓存中。
如图10所示,图10本公开根据一示例性实施例示出的另一种实现类的动态调用装置框图,该实施例在前述图9实施例的基础上,所述加载子模块342包括:
加载单元3421,被配置为加载预设目录下的所有文件;
读取单元3422,被配置为对所述预设目录下的所有文件进行遍历,逐行读取每个文件中所包括的实现类。
可选地,所述预设条件包括:
添加了目标实现类注解且属于用于实现所述当前接口的类;所述目标实现类注解用于标识需要动态调用的实现类。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本公开方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
相应的,本公开还提供一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序用于执行上述任一所述的实现类的动态调用方法。
相应的,本公开还提供一种实现类的动态调用装置,所述装置包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为:
检测当前接口是否属于目标类接口;所述目标类接口是插件式且需要动态调用相应的实现类的接口;
如果所述当前接口属于目标类接口,则检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器;所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类;
如果所述接口加载器中已缓存了所述目标扩展服务加载器,则通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。
如图11所示,图11是根据一示例性实施例示出的一种用于实现类的动态调用装置1100的一结构示意图。例如,装置1100可以被提供为一云平台。参照图11,装置1100包括处理组件1122,其进一步包括一个或多个处理器,以及由存储器1132所代表的存储器资源,用于存储可由处理部件1122的执行的指令,例如应用程序。存储器1132中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件1122被配置为执行指令,以执行上述任一所述的实现类的动态调用方法。
装置1100还可以包括一个电源组件1126被配置为执行装置11100的电源管理,一个有线或无线网络接口1150被配置为将装置1100连接到网络,和一个输入输出(I/O)接口1158。装置1100可以操作基于存储在存储器1132的操作系统,例如Windows ServerTM,MacOS XTM,UnixTM,LinuxTM,FreeB SDTM或类似。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或者惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
以上所述仅为本公开的较佳实施例而已,并不用以限制本公开,凡在本公开的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本公开保护的范围之内。
Claims (16)
1.一种实现类的动态调用方法,其特征在于,所述方法包括:
检测当前接口是否属于目标类接口;所述目标类接口是插件式且需要动态调用相应的实现类的接口;
如果所述当前接口属于目标类接口,则检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器;所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类;
如果所述接口加载器中已缓存了所述目标扩展服务加载器,则通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。
2.根据权利要求1所述的方法,其特征在于,所述检测当前接口是否属于目标类接口,包括:
检测所述当前接口是否包括目标接口注解,所述目标接口注解用于标识需要动态调用相应的实现类的接口。
3.根据权利要求1所述的方法,其特征在于,所述在所述当前接口所对应的实现类中确定目标实现类,包括:
在所述当前接口所对应的实现类中,根据所述当前业务对应的实现类名称确定所述目标实现类。
4.根据权利要求1所述的方法,其特征在于,所述方法还包括:
如果所述接口加载器中未缓存所述目标扩展服务加载器,则创建所述目标扩展服务加载器对应的目标对象;所述目标对象包括所述当前接口和所述当前接口所对应的实现类;
缓存所述目标对象到所述接口加载器中;
在缓存所述目标对象到所述接口加载器中之后,执行所述通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类的步骤。
5.根据权利要求4所述的方法,其特征在于,所述创建所述目标扩展服务加载器对应的目标对象,包括:
在所述接口加载器的目标扩展服务加载器函数中保存所述当前接口的定义;所述目标扩展服务器加载函数是与所述目标扩展服务加载器对应的函数;
通过所述目标扩展服务加载器函数,加载所述当前接口对应的所有实现类;
从spring容器中获取所述所有实现类中满足预设条件的实现类的实例;
将从spring容器中获取的所述实例加入实例加载器的缓存中。
6.根据权利要求5所述的方法,其特征在于,所述加载所述当前接口对应的所有实现类,包括:
加载预设目录下的所有文件;
对所述预设目录下的所有文件进行遍历,逐行读取每个文件中所包括的实现类。
7.根据权利要求5所述的方法,其特征在于,所述预设条件包括:
添加了目标实现类注解且属于用于实现所述当前接口的类;所述目标实现类注解用于标识需要动态调用的实现类。
8.一种实现类的动态调用装置,其特征在于,所述装置包括:
第一检测模块,被配置为检测当前接口是否属于目标类接口;所述目标类接口是插件式且需要动态调用相应的实现类的接口;
第二检测模块,被配置为如果所述当前接口属于目标类接口,则检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器;所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类;
动态调用模块,被配置为如果所述接口加载器中已缓存了所述目标扩展服务加载器,则通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。
9.根据权利要求8所述的装置,其特征在于,所述第一检测模块包括:
检测子模块,被配置为检测所述当前接口是否包括目标接口注解,所述目标接口注解用于标识需要动态调用相应的实现类的接口。
10.根据权利要求8所述的装置,其特征在于,所述动态调用模块包括:
确定子模块,被配置为在所述当前接口所对应的实现类中,根据所述当前业务对应的实现类名称确定所述目标实现类。
11.根据权利要求8所述的装置,其特征在于,所述装置还包括:
对象创建模块,被配置为如果所述接口加载器中未缓存所述目标扩展服务加载器,则创建所述目标扩展服务加载器对应的目标对象;所述目标对象包括所述当前接口和所述当前接口所对应的实现类;
缓存模块,被配置为缓存所述目标对象到所述接口加载器中;
控制模块,被配置为在缓存所述目标对象到所述接口加载器中之后,控制所述动态调用模块通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类。
12.根据权利要求11所述的装置,其特征在于,所述对象创建模块包括:
保存子模块,被配置为在所述接口加载器的目标扩展服务加载器函数中保存所述当前接口的定义;所述目标扩展服务器加载函数是与所述目标扩展服务加载器对应的函数;
加载子模块,被配置为通过所述目标扩展服务加载器函数,加载所述当前接口对应的所有实现类;
实例获取子模块,被配置为从spring容器中获取所述所有实现类中满足预设条件的实现类的实例;
实例添加子模块,被配置为将从spring容器中获取的所述实例加入实例加载器的缓存中。
13.根据权利要求12所述的装置,其特征在于,所述加载子模块包括:
加载单元,被配置为加载预设目录下的所有文件;
读取单元,被配置为对所述预设目录下的所有文件进行遍历,逐行读取每个文件中所包括的实现类。
14.根据权利要求12所述的装置,其特征在于,所述预设条件包括:
添加了目标实现类注解且属于用于实现所述当前接口的类;所述目标实现类注解用于标识需要动态调用的实现类。
15.一种计算机可读存储介质,其特征在于,所述存储介质存储有计算机程序,所述计算机程序用于执行上述权利要求1-7任一所述的实现类的动态调用方法。
16.一种实现类的动态调用装置,其特征在于,所述装置包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为:
检测当前接口是否属于目标类接口;所述目标类接口是插件式且需要动态调用相应的实现类的接口;
如果所述当前接口属于目标类接口,则检测接口加载器中是否缓存了与所述当前接口对应的目标扩展服务加载器;所述目标扩展服务加载器用于加载所述当前接口以及动态调用所述当前接口所对应的实现类;
如果所述接口加载器中已缓存了所述目标扩展服务加载器,则通过所述目标扩展服务加载器,在所述当前接口所对应的实现类中确定目标实现类,并调用所述目标实现类;所述目标实现类是用于实现当前业务的实现类。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811608558.2A CN109710428B (zh) | 2018-12-27 | 2018-12-27 | 一种实现类的动态调用方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811608558.2A CN109710428B (zh) | 2018-12-27 | 2018-12-27 | 一种实现类的动态调用方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109710428A true CN109710428A (zh) | 2019-05-03 |
CN109710428B CN109710428B (zh) | 2021-07-13 |
Family
ID=66258523
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811608558.2A Active CN109710428B (zh) | 2018-12-27 | 2018-12-27 | 一种实现类的动态调用方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109710428B (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110795109A (zh) * | 2019-10-25 | 2020-02-14 | 北京达佳互联信息技术有限公司 | 一种功能扩展方法、装置及电子设备 |
CN111078308A (zh) * | 2019-10-18 | 2020-04-28 | 北京奇艺世纪科技有限公司 | 类的自动加载方法、装置、电子设备及存储介质 |
CN111142860A (zh) * | 2019-12-31 | 2020-05-12 | 广州酷狗计算机科技有限公司 | 用于实现接口调用的方法及装置 |
CN111356021A (zh) * | 2020-04-13 | 2020-06-30 | 深圳Tcl数字技术有限公司 | 电视应用的控制方法、智能电视及可读存储介质 |
CN112256249A (zh) * | 2020-10-15 | 2021-01-22 | 深圳Tcl新技术有限公司 | 扩展Android系统功能的方法、设备及计算机存储介质 |
CN112417020A (zh) * | 2020-11-25 | 2021-02-26 | 武汉联影医疗科技有限公司 | 业务扩展的实现方法、装置、计算机设备和存储介质 |
CN112637232A (zh) * | 2020-12-29 | 2021-04-09 | 国云科技股份有限公司 | 支持多种策略的云平台资源隔离框架实现方法及装置 |
CN112685020A (zh) * | 2020-12-24 | 2021-04-20 | 京东数字科技控股股份有限公司 | 动态创建服务接口的方法、装置、电子设备及存储介质 |
CN113448550A (zh) * | 2020-03-25 | 2021-09-28 | 北京字节跳动网络技术有限公司 | 实现类的收集管理方法、装置、电子设备及计算机介质 |
CN113795001A (zh) * | 2021-09-18 | 2021-12-14 | 上海中通吉网络技术有限公司 | 基于spi进行系统短信发送的方法及装置 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070168509A1 (en) * | 2005-12-30 | 2007-07-19 | Droshev Mladen I | System and method for remote loading of classes |
CN101958987A (zh) * | 2009-07-14 | 2011-01-26 | 中国电信股份有限公司 | 电信业务数据动态转换的方法及其系统 |
CN102411506A (zh) * | 2011-07-07 | 2012-04-11 | 杭州典能科技有限公司 | Java系统业务单元插件式管理系统及业务功能动态变更方法 |
CN105204871A (zh) * | 2015-10-30 | 2015-12-30 | 亚信科技(南京)有限公司 | 一种插件式开发方法和装置 |
CN106406911A (zh) * | 2016-10-26 | 2017-02-15 | 国云科技股份有限公司 | 一种计算机软件系统功能组件化的方法 |
CN106528215A (zh) * | 2016-10-25 | 2017-03-22 | 广东亿迅科技有限公司 | 基于java的动态加载命令的方法及装置 |
-
2018
- 2018-12-27 CN CN201811608558.2A patent/CN109710428B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070168509A1 (en) * | 2005-12-30 | 2007-07-19 | Droshev Mladen I | System and method for remote loading of classes |
CN101958987A (zh) * | 2009-07-14 | 2011-01-26 | 中国电信股份有限公司 | 电信业务数据动态转换的方法及其系统 |
CN102411506A (zh) * | 2011-07-07 | 2012-04-11 | 杭州典能科技有限公司 | Java系统业务单元插件式管理系统及业务功能动态变更方法 |
CN105204871A (zh) * | 2015-10-30 | 2015-12-30 | 亚信科技(南京)有限公司 | 一种插件式开发方法和装置 |
CN106528215A (zh) * | 2016-10-25 | 2017-03-22 | 广东亿迅科技有限公司 | 基于java的动态加载命令的方法及装置 |
CN106406911A (zh) * | 2016-10-26 | 2017-02-15 | 国云科技股份有限公司 | 一种计算机软件系统功能组件化的方法 |
Non-Patent Citations (3)
Title |
---|
JAST_00: "java根据不同的参数调用不同的实现类(猿的私生活—学习)", 《HTTPS://BLOG.CSDN.NET/JAST_00/ARTICLE/DETAILS/53171884》 * |
丁易难: "基于.NET Web Service的动态接口设计与实现", 《软件导刊》 * |
某先生XXXX: "ServiceLoader服务提供者模式,实现动态插件加载,类责任链模式", 《HTTPS://BLOG.CSDN.NET/WSSCY2004/ARTICLE/DETAILS/41723749》 * |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111078308A (zh) * | 2019-10-18 | 2020-04-28 | 北京奇艺世纪科技有限公司 | 类的自动加载方法、装置、电子设备及存储介质 |
CN111078308B (zh) * | 2019-10-18 | 2023-12-15 | 北京奇艺世纪科技有限公司 | 类的自动加载方法、装置、电子设备及存储介质 |
CN110795109A (zh) * | 2019-10-25 | 2020-02-14 | 北京达佳互联信息技术有限公司 | 一种功能扩展方法、装置及电子设备 |
CN111142860A (zh) * | 2019-12-31 | 2020-05-12 | 广州酷狗计算机科技有限公司 | 用于实现接口调用的方法及装置 |
CN111142860B (zh) * | 2019-12-31 | 2023-05-23 | 广州酷狗计算机科技有限公司 | 用于实现接口调用的方法及装置 |
CN113448550B (zh) * | 2020-03-25 | 2023-12-15 | 抖音视界有限公司 | 实现类的收集管理方法、装置、电子设备及计算机介质 |
CN113448550A (zh) * | 2020-03-25 | 2021-09-28 | 北京字节跳动网络技术有限公司 | 实现类的收集管理方法、装置、电子设备及计算机介质 |
CN111356021A (zh) * | 2020-04-13 | 2020-06-30 | 深圳Tcl数字技术有限公司 | 电视应用的控制方法、智能电视及可读存储介质 |
CN112256249A (zh) * | 2020-10-15 | 2021-01-22 | 深圳Tcl新技术有限公司 | 扩展Android系统功能的方法、设备及计算机存储介质 |
CN112417020A (zh) * | 2020-11-25 | 2021-02-26 | 武汉联影医疗科技有限公司 | 业务扩展的实现方法、装置、计算机设备和存储介质 |
CN112417020B (zh) * | 2020-11-25 | 2023-08-18 | 武汉联影医疗科技有限公司 | 业务扩展的实现方法、装置、计算机设备和存储介质 |
CN112685020A (zh) * | 2020-12-24 | 2021-04-20 | 京东数字科技控股股份有限公司 | 动态创建服务接口的方法、装置、电子设备及存储介质 |
CN112637232A (zh) * | 2020-12-29 | 2021-04-09 | 国云科技股份有限公司 | 支持多种策略的云平台资源隔离框架实现方法及装置 |
CN113795001A (zh) * | 2021-09-18 | 2021-12-14 | 上海中通吉网络技术有限公司 | 基于spi进行系统短信发送的方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN109710428B (zh) | 2021-07-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109710428A (zh) | 一种实现类的动态调用方法及装置 | |
CN109857667B (zh) | 接口自动化测试方法、测试装置、测试设备及存储介质 | |
CN103391535B (zh) | 多终端共享虚拟sim卡的方法、终端、服务器及系统 | |
CN109034814B (zh) | 基于以太坊虚拟机的智能合约处理方法和装置 | |
CN111258773B (zh) | 服务调用流程信息处理方法、装置及电子设备 | |
CN110187912B (zh) | 一种节点选择方法和装置 | |
CN106227554A (zh) | 一种在ios系统中进行应用热更新的方法和装置 | |
CN110808857B (zh) | 实现Kubernetes集群的网络互通方法、装置、设备以及存储介质 | |
CN104731622B (zh) | 一种应用程序的加载方法、装置和移动终端 | |
CN105933930B (zh) | 双卡模式下的搜网方法和装置 | |
CN109656584A (zh) | 一种程序的烧录方法及装置 | |
CN107844518A (zh) | 评估指定app下载量的方法、数据服务器、打包平台及系统 | |
CN106776350A (zh) | 一种程序的精准测试方法和装置 | |
CN110276193A (zh) | 风险特征输出方法、应用运行控制方法、系统及装置 | |
CN109857432A (zh) | 一种游戏应用的热更新方法和装置 | |
CN106201852A (zh) | 一种分布式测试方法及测试系统 | |
CN110045998A (zh) | 加载动态库的方法及装置 | |
CN108037989A (zh) | Sdk组件识别方法及装置 | |
CN107526966B (zh) | 一种Android平台的复合污点传播追踪方法 | |
CN107239298A (zh) | 应用程序调试方法及装置 | |
CN106598642A (zh) | 在插件中使用服务的方法及装置 | |
CN108124021A (zh) | 网际协议ip地址获取、网站访问的方法、装置及系统 | |
CN110401925A (zh) | 一种通讯消息的生成方法及装置 | |
US7793310B2 (en) | Dynamically inserting proxies into JAVA environments without coding explicit proxy hooks into JAVA applications | |
CN107766212A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |