反射场景下确定类重载方法的方法及装置
技术领域
本发明涉及计算机程序处理技术,尤其涉及一种反射场景下确定类重载方法的方法及装置。
背景技术
在Java系统开发中,常常需要使用反射来调用对象,反射就是指计算机程序在运行时可以访问、检测和修改自身状态或行为的一种能力,用比喻来说,这种程序能够“观察”并且修改自己的行为。
通常来说,在反射场景中,当接收到业务请求,该业务请求中包含有入参(实参)列表,为了找到能够匹配并执行该入参列表中入参的对应方法,则通过方法名来确定唯一与该入参对应的方法。但是当有多个同名的重载方法时,特别是在入参列表中的参数个数相同、且入参列表与方法参数列表具有继承关系时,到底应该调用哪个方法,就变得难于确定,导致该入参不能被执行,程序报错。其中,“重载”是指在同一个类中定义了一个以上具有相同名称,但是型构不同的方法;也就是说,函数或者方法有同样的名称,但是参数列表不相同的情形。“继承”是面向对象软件技术当中的一个概念。如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。还可以为子类追加新的属性和方法。也就是说,继承是在一个现有类型的基础上,通过覆盖、增加新的方法或者重新定义已有方法的方式,产生一个新的类型。
发明内容
本发明提供一种反射场景下确定类重载方法的方法及装置,以解决现有技术中有多个重载方法,且入参列表与方法列表具有继承关系时无法正确调用与入参列表匹配的方法的技术问题。
一方面,本发明提供一种反射场景下确定类重载方法的方法,包括:
根据外部入参所指定的方法名,确定类内所有同名方法;所述同名方法具有与所述外部入参所指定的方法名相同的方法名称;
若同名方法的个数多于一个,获取所述外部入参与每个所述同名方法间的继承关系;
根据所述继承关系,确定每个所述同名方法相对于所述外部入参的匹配度;
根据匹配度结果,在多个同名方法中确定所述外部入参的类重载方法。
本实施例通过根据外部入参与同名方法间的继承关系,对多个同名方法进行匹配度计算,并根据计算结果确定与入参相匹配且匹配度高的方法作为该外部入参对应的类重载方法,从而解决了现有技术中当存在多个重载方法,且入参列表与方法列表具有继承关系时无法正确调用与入参列表匹配的方法的技术问题,本发明实现了快速、高效为入参确定是否有可调用的方法,以及为入参提供可靠性高的类重载方法。
作为一种可实现的方式,所述若同名方法的个数多于一个,获取所述外部入参与每个所述同名方法间的继承关系,包括:
将每个所述同名方法内的每个形参与所述外部入参内的每个实参进行比较,确定所述外部入参与每个所述同名方法间的继承关系。
作为一种可实现的方式,所述将每个所述同名方法内的每个形参与所述外部入参内的每个实参进行比较,确定所述外部入参与每个所述同名方法间的继承关系,包括:
根据所述同名方法内每个形参的位置先后顺序,确定所述外部参数中的每个实参与对应位置处的同名方法中的每个形参之间的继承层数;
根据所述继承层数,确定所述外部入参与每个所述同名方法间的继承关系。
作为一种可实现的方式,所述根据所述继承层数,确定所述外部入参与每个所述同名方法间的继承关系,包括:
若所述外部参数中的至少一个实参与所述同名方法对应位置处的形参之间不存在继承层数,确定所述外部入参与所述同名方法之间不存在继承关系;
若所述外部参数中的每个实参与所述同名方法对应位置处的每个形参之间存在继承层数,确定所述外部入参与所述同名方法之间存在继承关系。
作为一种可实现的方式,所述根据所述继承关系,确定每个所述同名方法相对于所述外部入参的匹配度,包括:
根据所述继承关系,确定每个同名方法的方法向量;
确定每个所述方法向量的模值,根据所述模值的大小确定每个所述同名方法相对于所述外部入参的匹配度。
作为一种可实现的方式,所述根据所述继承关系,确定每个同名方法的方法向量,包括:
根据每个所述同名方法内的形参的参数个数,确定每个同名方法的方法向量的向量维数;
根据每个位置相互对应的实参与形参之间的继承层数,确定每个方法向量中每一维向量元素的元素值。
作为一种可实现的方式,若位置相互对应的实参与形参之间没有继承关系,则确定所述同名方法不是所述外部入参的类重载方法。
作为一种可实现的方式,所述根据每个位置相互对应的实参与形参之间的继承层数,确定每个方法向量中每一维向量元素的元素值,包括:
若所述位置相互对应的实参与形参之间没有继承关系,确定所述实参与形参之间的继承层数为一预设无效数值;
以所述预设无效数值作为与所述形参对应维的向量元素的元素值;
相应的,所述根据所述继承关系,确定每个所述同名方法相对于所述外部入参的匹配度,包括:
根据所述预设无效数值,确定所述方法向量的模值为极大值;
相应的,所述根据匹配度结果,在多个同名方法中确定所述外部入参的类重载方法,包括:
根据所述极大值的模值,确定具有所述极大值的同名方法不是所述外部入参的类重载方法。
作为一种可实现的方式,所述根据每个位置相互对应的实参与形参之间的继承层数,确定每个方法向量中每一维向量元素的元素值,包括:
若所述位置相互对应的实参与形参之间存在继承关系,确定所述实参与形参之间的继承层数;
以所述继承层数的数值作为与所述形参对应维的向量元素的元素值。
作为一种可实现的方式,所述根据匹配度结果,在多个同名方法中确定所述外部入参的类重载方法,包括:
根据模值的大小对同名方法进行排序,选取具有最小模值的同名方法作为所述外部入参的类重载方法。
本实施例通过确定外部入参与同名方法间的继承关系,并将该继承关系映射到对向量模值的量化计算中,进而以模值大小衡量外部入参与同名方法之间的匹配度,以为外部入参提供准确、可靠的类重载方法;从而快速、高效地对是否存在可调用方法进行判断,以为入参提供最为匹配的类重载方法。
作为一种可实现的方式,所述获取所述外部入参与每个所述同名方法间的继承关系之前,还包括:
根据所述外部入参的参数属性对多个所述同名方法进行筛选;所述参数属性包括以下至少一项:外部入参的参数个数、外部入参的数据类型。
作为一种可实现的方式,所述根据所述外部入参的参数属性对多个所述同名方法进行筛选,包括:
根据所述外部入参的参数个数,删除与所述外部入参的参数个数不相等的同名方法;
和/或,
根据所述外部入参的数据类型,删除与所述外部入参的数据类型不相符的同名方法。
本实施例通过根据入参的参数个数、数据类型等对同名方法进行筛选,以快速、高效地定位出待进行入参匹配度计算的同名方法。从而提高入参与类重载方法的匹配效率。
作为一种可实现的方式,所述方法还包括:
若同名方法的个数为一个,则判断所述外部入参内的每个参数与所述同名方法中的每个参数是否存在继承关系;
若是,则确认所述同名方法为所述外部入参的类重载方法;
若不是,则返回无可用调用方法的提示信息。
另一方面,本发明提供一种反射场景下确定类重载方法的装置,包括:
确定模块,用于根据外部入参所指定的方法名,确定类内所有同名方法;所述同名方法具有与所述外部入参所指定的方法名相同的方法名称;
获取模块,用于当同名方法的个数多于一个的情况下,获取所述外部入参与每个所述同名方法间的继承关系;
所述确定模块,还用于根据所述继承关系,确定每个所述同名方法相对于所述外部入参的匹配度;根据匹配度结果,在多个同名方法中确定所述外部入参的类重载方法。
作为一种可实现的方式,所述获取模块包括:
比较子模块,用于将每个所述同名方法内的每个形参与所述外部入参内的每个实参进行比较;
确定子模块,用于确定所述外部入参与每个所述同名方法间的继承关系。
作为一种可实现的方式,所述确定子模块包括:
继承层数确定子模块,用于根据所述同名方法内每个形参的位置先后顺序,确定所述外部参数中的每个实参与对应位置处的同名方法中的每个形参之间的继承层数;
继承关系确定子模块,用于根据所述继承层数,确定所述外部入参与每个所述同名方法间的继承关系。
作为一种可实现的方式,所述继承关系确定子模块,具体用于当所述外部参数中的至少一个实参与所述同名方法对应位置处的形参之间不存在继承层数的情况下,确定所述外部入参与所述同名方法之间不存在继承关系;当所述外部参数中的每个实参与所述同名方法对应位置处的每个形参之间存在继承层数时,确定所述外部入参与所述同名方法之间存在继承关系。
作为一种可实现的方式,所述确定模块,包括:
向量确定子模块,用于根据所述继承关系,确定每个同名方法的方法向量;
模值确定子模块,用于确定每个所述方法向量的模值,根据所述模值的大小确定每个所述同名方法相对于所述外部入参的匹配度。
作为一种可实现的方式,所述向量确定子模块,包括:
维数确定子模块,用于根据每个所述同名方法内的形参的参数个数,确定每个同名方法的方法向量的向量维数;
元素值确定子模块,用于根据每个位置相互对应的实参与形参之间的继承层数,确定每个方法向量中每一维向量元素的元素值。
作为一种可实现的方式,所述确定模块还用于,
当位置相互对应的实参与形参之间没有继承关系的情况下,确定所述同名方法不是所述外部入参的类重载方法。
作为一种可实现的方式,所述元素值确定子模块,具体用于当所述位置相互对应的实参与形参之间没有继承关系的情况下,确定所述实参与形参之间的继承层数为一预设无效数值;以所述预设无效数值作为与所述形参对应维的向量元素的元素值;
所述确定模块,还包括:
极大值确定子模块,用于根据所述预设无效数值,确定所述方法向量的模值为极大值;根据所述极大值的模值,确定具有所述极大值的同名方法不是所述外部入参的类重载方法。
作为一种可实现的方式,所述元素值确定子模块,具体用于当所述位置相互对应的实参与形参之间存在继承关系的情况下,确定所述实参与形参之间的继承层数;以所述继承层数的数值作为与所述形参对应维的向量元素的元素值。
作为一种可实现的方式,所述确定模块,还包括:
方法确定子模块,用于根据模值的大小对同名方法进行排序,选取具有最小模值的同名方法作为所述外部入参的类重载方法。
作为一种可实现的方式,所述装置还包括:
筛选模块,用于根据所述外部入参的参数属性对多个所述同名方法进行筛选;所述参数属性包括以下至少一项:外部入参的参数个数、外部入参的数据类型。
作为一种可实现的方式,所述筛选模块包括:
个数筛选子模块,用于根据所述外部入参的参数个数,删除与所述外部入参的参数个数不相等的同名方法;
和/或,
类型筛选子模块,用于根据所述外部入参的数据类型,删除与所述外部入参的数据类型不相符的同名方法。
作为一种可实现的方式,所述装置还包括:
判断模块,用于当同名方法的个数为一个的情况下,判断所述外部入参内的每个参数与所述同名方法中的每个参数是否存在继承关系;若是,则确认所述同名方法为所述外部入参的类重载方法;若不是,则返回无可用调用方法的提示信息。
本发明通过根据外部入参与同名方法间的继承关系,对多个同名方法进行匹配度计算,并根据计算结果确定与入参相匹配且匹配度高的方法作为该外部入参对应的类重载方法,从而解决了现有技术中当存在多个重载方法,且入参列表与方法列表具有继承关系时无法正确调用与入参列表匹配的方法的技术问题,本发明实现了快速、高效为入参确定是否有可调用的方法,以及为入参提供可靠性高的类重载方法。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明一实施例提供的反射场景下确定类重载方法的方法的流程示意图;
图2为本发明一实施例提供的反射场景下确定类重载方法的方法的流程示意图;
图3为本发明一实施例提供的反射场景下确定类重载方法的方法的流程示意图;
图4为本发明一实施例提供的反射场景下确定类重载方法的装置的结构示意图;
图5为本发明一实施例提供的反射场景下确定类重载方法的装置的结构示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置和方法的例子。
在本发明实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。
应当理解,本文中使用的术语“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
应当理解,尽管在本发明实施例中可能采用术语第一、第二、第三等来描述XXX,但这些XXX不应限于这些术语。这些术语仅用来将XXX彼此区分开。例如,在不脱离本发明实施例范围的情况下,第一XXX也可以被称为第二XXX,类似地,第二XXX也可以被称为第一XXX。
取决于语境,如在此所使用的词语“如果”、“若”可以被解释成为“在……时”或“当……时”或“响应于确定”或“响应于检测”。类似地,取决于语境,短语“如果确定”或“如果检测(陈述的条件或事件)”可以被解释成为“当确定时”或“响应于确定”或“当检测(陈述的条件或事件)时”或“响应于检测(陈述的条件或事件)”。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的商品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种商品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的商品或者系统中还存在另外的相同要素。
图1为本发明一实施例提供的反射场景下确定类重载方法的方法的流程示意图。本实施例的执行主体可以为反射场景下确定类重载方法的装置,该装置可以通过硬件实现,也可以通过硬件执行相应的软件实现。该装置可以被实现在任何具备处理器的终端设备中。该终端设备例如可以是移动终端,该移动终端包括平板、手机;可以是云端的服务器设备等。如图1所示,该方法的具体流程包括:
步骤101、根据外部入参所指定的方法名,确定类内所有同名方法。
其中,同名方法具有与外部入参所指定的方法名相同的方法名称。
外部入参也叫做实参,其为程序接口处由外部输入供程序运行的实际参数;是在调用方法或函数时,传递给被调用函数的值。入参可以是常量、变量、表达式、函数等,无论入参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给被调用方法中所包含的形参。因此通常来说,入参都预先用赋值,输入等办法获得确定值。
类是对现实生活中一类具有共同特征的事物的抽象。如果一个程序里提供的类型与应用中的概念有直接的对应,这个程序就会更容易理解,也更容易修改。类的内部封装有方法,其是对某种对象的定义,具有行为(behavior),它描述一个对象能够做什么以及做的方法(method)。类中可以包含有层级结构的子类,而类间方法的调用以及同级类中存在着继承与重载的概念。
“继承”是面向对象软件技术当中的一个概念。如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。还可以为子类追加新的属性和方法。也就是说,继承是在一个现有类型的基础上,通过覆盖、增加新的方法或者重新定义已有方法的方式,产生一个新的类型。
“重载”是指在同一个类中定义了一个以上具有相同名称,但是型构不同的方法;也就是说,函数或者方法有同样的名称,但是参数列表不相同的情形。继承是指类之间关系;有继承关系的两个类,子类重写了一个与父类完全相同的方法,叫覆盖;同一个类中的有多个同名方法,叫重载。例如,子类B继承自父类A;子类B中包含有方法1(a1,a2),该方法覆盖了父类A中的方法1(a1,a2);子类B方法1(a1,a2)和子类B方法1(a1,a2,a3)是重载关系。
可见,由于类内所存在的众多子类,以及各子类间的继承关系,致使类内存在多个同名方法,因此可以根据入参所指定的方法名,先确定类内可能被调用的用于执行该入参的所有方法。
步骤102、若同名方法的个数多于一个,获取外部入参与每个同名方法间的继承关系。
步骤103、根据继承关系,确定每个同名方法相对于外部入参的匹配度。
例如,在某个类中,存在两个同名方法Class.method(Parent p1,Child c2,Parent p3),Class.method(Child c1,Parent p2,Child c3);其中,child与parent具有继承关系;程序调用时,假设外部入参是Class.method(Child,Child,Child),则上述两个同名方法与外部入参的Class.method(Child,Child,Child)之间均存在着继承关系,由于此时参数个数(3个)相同,假设数据类型等参数属性也均相同,则程序很难确定使用哪个方法,就算是非反射调用,在编译时也确认不了,通常还会导致编译不通过,程序执行出错等问题。本发明就是在存在多个同名方法,程序难以辨识时,给予入参快速且有效的最佳方法调用的方法。具体可以通过对同名方法Class.method(Parent p1,Child c2,Parent p3)与Class.method(Child c1,Parent p2,Child c3)与外部入参Class.method(Child,Child,Child)之间的方法匹配度进行评估,以为外部入参选择最有利于程序执行的方法。
步骤104、根据匹配度结果,在同名方法中确定该外部入参的类重载方法。
本实施例通过根据外部入参与同名方法间的继承关系,确定每个同名方法相对于外部入参的匹配度,以根据匹配度结果为入参选择最为匹配的类重载方法,解决了现有技术中当存在多个重载方法,且入参列表与方法列表具有继承关系时无法正确调用与入参列表匹配的方法的技术问题,实现了快速、高效为入参确定是否有可调用的方法,以及为入参提供可靠性高的类重载方法。
下面采用详细的实施例,对本发明的反射场景下确定类重载方法的方法的过程进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程在某些实施例不再赘述。
图2为本发明一实施例提供的反射场景下确定类重载方法的方法的流程示意图。本实施例采用一个具体的实施例,对上述实施例中当判断同名方法的个数多于一个时,如何根据外部入参与同名方法间的继承关系,确定同名方法相对于外部入参的匹配度,并进行类重载方法选定的步骤进行详细说明。具体步骤包括:
步骤201、将每个同名方法内的每个形参与外部入参内的每个实参进行比较,确定外部入参与每个同名方法间的继承关系。
具体的,根据同名方法内每个形参的位置先后顺序,将每个形参与外部入参内的每个实参进行比较,确定外部参数中的每个实参与对应位置处的同名方法中的每个形参之间的继承层数,根据该继承层数,确定外部入参与每个同名方法间的继承关系。若外部参数中的至少一个实参与同名方法对应位置处的形参之间不存在继承层数,确定外部入参与同名方法之间不存在继承关系;若外部参数中的每个实参与同名方法对应位置处的每个形参之间存在继承层数,确定外部入参与同名方法之间存在继承关系。根据上述方法,确定出若入参中的某一参数与同名方法中的对应参数之间存在继承关系,则需要统计两个参数之间的继承层数;若入参中的某一参数与同名方法中的对应参数之间没有继承关系,则确定两个参数之间的继承层数为一预设无效数值;只要同名方法中的任一形参与外部入参之间存在一预设无效数值,无论其它形参是否与入参存在继承关系,都判断该具有预设无效数值的同名方法不是与外部入参相匹配的方法。该判断过程采用计算机程序执行时,可采用以下示例设置,将预设无效数值设置为一预设负数数值,当程序判断出现负数数值时,程序返回预设极大值,以确定具有极大值的同名方法不是该外部入参所匹配的类重载方法。通过将没有继承关系的匹配度数值确定为极大值以便于计算机快速识别与判断,以排除该具有极大值的同名方法。
步骤202、根据继承关系,确定每个同名方法的方法向量。
具体的,根据每个同名方法内的形参的参数个数,确定每个同名方法的方法向量的向量维数;根据每个位置相互对应的实参与形参之间的继承层数,确定每个方法向量中每一维向量元素的元素值。若位置相互对应的实参与形参之间没有继承关系,则可以确定实参与形参之间的继承层数为一预设无效数值;并以该预设无效数值作为与形参对应维的向量元素的元素值;且当位置相互对应的实参与形参之间没有继承关系的情况下,可以确定该同名方法不是外部入参的类重载方法。若位置相互对应的实参与形参之间存在继承关系,确定实参与形参之间的继承层数;并以该继承层数的数值作为与形参对应维的向量元素的元素值。也就是说,向量中每个元素的数值大小以继承关系的层数值表示。举例来说,向量的维数与同名方法的形参参数个数相等,每一维的数值由对应参数间的继承关系的层数来确定,如果继承层数越多,元素数值越大;如果无继承关系,则数值可以定为一预设无效数值。例如,类内存在同名方法Class.method(Parent p1,Child c2,Parent p3),Class.method(Child c1,Parent p2,Child c3);则根据同名方法Class.method(Parentp1,Child c2,Parent p3)确定出向量X{x1,x2,x3},根据同名方法Class.method(Childc1,Parent p2,Child c3)确定出向量Y{y1,y2,y3},假设外部入参为Class.method(Child,Child,Child),且Child与Parent之间的继承关系假设为一层,则x1,x2,x3的数值为(1,0,1),y1,y2,y3的数值为(0,1,0);入参每取一次父类层则元素数值增加1,若继承层级为同层则元素数值为0,若没有继承关系,则取一预设无效值(如,负数值)。
步骤203、确定每个方法向量的模值,根据模值大小确定每个同名方法相对于外部入参的匹配度。
具体的,每个方法向量的模值可抽象地代表同名方法与入参间的调用距离关系,距离越近,则调用越便捷,有效节省调用时间、步骤等。通过对方法向量的模值进行计算可以获取到该距离关系,进而根据模值对同名方法与入参的匹配度进行判断。模值的计算方法可以采用现有技术中向量模值的通用计算方法,
对于计算机计算来说,为了减少计算量,可以不进行开方运算,仅计算向量中每个元素的平方和即可,以节省计算资源,提高计算效率。
步骤204、根据匹配度结果,在多个同名方法中确定外部入参的类重载方法。
具体的,以模值作为匹配度的衡量标准,可以根据模值的大小对同名方法进行排序,选取具有最小模值的同名方法作为外部入参的类重载方法。
进一步地,在步骤201、将每个同名方法内的每个形参与外部入参内的每个实参进行比较,确定外部入参与每个同名方法间的继承关系之前,还可以包括对同名方法进行快速初步筛选的过程。具体的,若同名方法的个数多于一个,则根据外部入参的参数属性对多个同名方法进行筛选。参数属性可以是入参的参数个数,入参的数据类型(常量、变量、表达式、函数等)等。在一个实施例中可以根据外部入参的参数个数,删除与外部入参的参数个数不相等的同名方法。在另一个实施例中可以根据外部入参的数据类型,删除与外部入参的数据类型不相符的同名方法。当然在采用参数个数筛选的基础上,还可以采用数据类型进一步对同名方法进行筛选,以减小后续选取与入参最佳匹配的方法的运算量,节省内存及计算资源,提高匹配速度。若初筛后参数个数及参数数据类型均相同的同名方法个数仍然多于一个,则采用前面的确定继承层数并计算方法向量模值的方法得到最佳匹配的同名方法。
本实施例通过将入参与同名方法间的继承关系映射到向量模值的计算中,进而以模值大小衡量入参与同名方法之间的匹配度,准确有效地为入参选择与之匹配程度高的类重载方法。解决了现有技术中当存在多个重载方法,且入参列表与方法列表具有继承关系时无法正确调用与入参列表匹配的方法的技术问题,本发明实现了快速、高效为入参确定是否有可调用的方法,以及为入参提供可靠性高的类重载方法。
图3为本发明一实施例提供的反射场景下确定类重载方法的方法的流程示意图。如图3所示,在上述实施例的基础上,本实施例的具体流程如下:
步骤301、根据外部入参所指定的方法名,确定类内所有同名方法。
步骤302、若同名方法的个数为一个,则判断外部入参内的每个参数与同名方法中的每个参数是否存在继承关系;若是,则执行步骤303;若不是,则执行步骤304。
步骤303、确认同名方法为外部入参的类重载方法。
步骤304、返回无可用调用方法的提示信息。
步骤305、若同名方法的个数多于一个,则根据外部入参的参数属性对多个同名方法进行筛选;筛选后,若个数为零,执行步骤304返回无可用调用方法的提示信息;若个数为一个,执行步骤302判断入参内的每个参数与同名方法中的每个参数是否存在继承关系;若是,则执行步骤303确认同名方法为入参对应的类重载方法;若不是,则执行步骤304返回无可用调用方法的提示信息;若个数多于一个,则执行步骤306。
具体的,筛选的方式可以根据入参的参数个数,删除包含有与入参的参数个数不相符的同名方法,和/或,根据入参的数据类型,删除与入参的数据类型不相符的同名方法。
步骤306、获取外部入参与同名方法间的继承关系,确定每个同名方法相对于外部入参的匹配度;根据匹配度结果,在同名方法中确定该外部入参的类重载方法。
图4为本发明一实施例提供的反射场景下确定类重载方法的装置的结构示意图。如图4所示,该装置的功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。该装置包括:
确定模块1,用于根据外部入参所指定的方法名,确定类内所有同名方法;同名方法具有与外部入参所指定的方法名相同的方法名称;
获取模块2,用于当同名方法的个数多于一个的情况下,获取外部入参与每个同名方法间的继承关系;
确定模块1,还用于根据继承关系,确定每个同名方法相对于外部入参的匹配度;根据匹配度结果,在多个同名方法中确定外部入参的类重载方法。
本实施例提供的装置,可用于执行上述方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。
图5为本发明一实施例提供的反射场景下确定类重载方法的装置的结构示意图。本实施例在图4实施例的基础上,
获取模块2包括:
比较子模块21,用于将每个同名方法内的每个形参与外部入参内的每个实参进行比较;
确定子模块22,用于确定外部入参与每个同名方法间的继承关系。
可选的,确定子模块22包括:
继承层数确定子模块221,用于根据同名方法内每个形参的位置先后顺序,确定外部参数中的每个实参与对应位置处的同名方法中的每个形参之间的继承层数;
继承关系确定子模块222,用于根据继承层数,确定外部入参与每个同名方法间的继承关系。
可选的,继承关系确定子模块222,具体用于当外部参数中的至少一个实参与同名方法对应位置处的形参之间不存在继承层数的情况下,确定外部入参与同名方法之间不存在继承关系;当外部参数中的每个实参与同名方法对应位置处的每个形参之间存在继承层数时,确定外部入参与同名方法之间存在继承关系。
可选的,确定模块1,包括:
向量确定子模块11,用于根据继承关系,确定每个同名方法的方法向量;
模值确定子模块12,用于确定每个方法向量的模值,根据模值的大小确定每个同名方法相对于外部入参的匹配度。
可选的,向量确定子模块11,包括:
维数确定子模块111,用于根据每个同名方法内的形参的参数个数,确定每个同名方法的方法向量的向量维数;
元素值确定子模块112,用于根据每个位置相互对应的实参与形参之间的继承层数,确定每个方法向量中每一维向量元素的元素值。
可选的,确定模块1还用于,当位置相互对应的实参与形参之间没有继承关系的情况下,确定同名方法不是外部入参的类重载方法。
可选的,元素值确定子模块112,具体用于当位置相互对应的实参与形参之间没有继承关系的情况下,确定实参与形参之间的继承层数为一预设无效数值;以预设无效数值作为与形参对应维的向量元素的元素值;
确定模块11,还包括:
极大值确定子模块113,用于根据预设无效数值,确定方法向量的模值为极大值;根据极大值的模值,确定具有极大值的同名方法不是外部入参的类重载方法。
可选的,元素值确定子模块112,具体用于当位置相互对应的实参与形参之间存在继承关系的情况下,确定实参与形参之间的继承层数;以继承层数的数值作为与形参对应维的向量元素的元素值。
可选的,确定模块1,还包括:
方法确定子模块13,用于根据模值的大小对同名方法进行排序,选取具有最小模值的同名方法作为外部入参的类重载方法。
可选的,装置还包括:
筛选模块3,用于根据外部入参的参数属性对多个同名方法进行筛选;参数属性包括以下至少一项:外部入参的参数个数、外部入参的数据类型。
可选的,筛选模块3包括:
个数筛选子模块31,用于根据外部入参的参数个数,删除与外部入参的参数个数不相等的同名方法;
和/或,
类型筛选子模块32,用于根据外部入参的数据类型,删除与外部入参的数据类型不相符的同名方法。
可选的,装置还包括:
判断模块4,用于当同名方法的个数为一个的情况下,判断外部入参内的每个参数与同名方法中的每个参数是否存在继承关系;若是,则确认同名方法为外部入参的类重载方法;若不是,则返回无可用调用方法的提示信息。
本实施例提供的装置,可用于执行上述方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。