[发明专利]建立不同版本程序类集合映射关系的方法有效
| 申请号: | 201911138413.5 | 申请日: | 2019-11-20 |
| 公开(公告)号: | CN110908705B | 公开(公告)日: | 2021-06-22 |
| 发明(设计)人: | 陈星;陈晓娜;胡传淑敏;郭莹楠;陈艳 | 申请(专利权)人: | 福州大学 |
| 主分类号: | G06F8/71 | 分类号: | G06F8/71 |
| 代理公司: | 福州元创专利商标代理有限公司 35100 | 代理人: | 丘鸿超;蔡学俊 |
| 地址: | 350108 福建省福州市*** | 国省代码: | 福建;35 |
| 权利要求书: | 查看更多 | 说明书: | 查看更多 |
| 摘要: | |||
| 搜索关键词: | 建立 不同 版本 程序 集合 映射 关系 方法 | ||
1.一种建立不同版本程序类集合映射关系的方法,其特征在于,包括以下步骤:
步骤S1:获取同一程序两个不同版本的源代码;
步骤S2:根据步骤1的两个不同版本的源代码通过代码分析获取数据结构信息和类与类之间的关系,以及类中方法与方法间的调用关系,生成类图;
步骤S3:计算初步类相似度:通过步骤S2获得的信息建立两个版本程序类集合的模型信息,以其中一个版本程序的类集合为类集合A,通过预定义的类相似度评判因素计算相似度,确定被映射版本程序类集合B中每个类在类相似度评判因素下对类集合A每个类的相似度;
步骤S4:计算方法相似度:通过步骤S2获得的信息建立两个版本方法集合的模型信息,以其中一个版本程序的方法集合为方法集合A,通过预定义的方法相似度评判因素计算相似度,确定被映射版本程序方法集合B中每个方法在方法相似度评判因素下对方法集合A每个方法的相似度;
步骤S5:建立映射关系:取具有最高相似度的方法对,建立方法的“一对一”映射;根据方法的映射关系,通过逐步迭代的方式调整类的相似度,并最终确定类间的相似度;
所述程序为Java程序;
步骤S2具体包括:
步骤S21:定义
定义1:给定程序的类集合CLASS={Class1,Class2,...,Classn};
其中,Classi是程序的第i个类;表示为三元组:Classi=className,FIELD,METHOD;className表示类名,FIELD表示当前类的所有属性集合,METHOD表示当前类的所有方法集合;
定义2:任意一个类的属性集合FIELD={Field1,Field2,...,Fieldn};
其中,Filedi是当前类的第i个属性;表示为一个三元组:Fieldi=fieldModifier,fieldType,fieldName,fieldModifier是属性的权限,fieldType是属性的类型,fieldName是属性的名称;
定义3:任意一个类的方法集合METHOD={Method1,Method2,...,Methodn};
其中,Methodi是当前类的第i个方法;表示为一个四元组:Methodi=methodModifier,methodReturnType,methodName,METHODPARAM,methodModifier表示方法权限,methodReturnType表示方法的返回值类型,methodName表示方法的名称,METHODPARAM={methodParam1,methodParam2,...,methodParamn}表示该方法的参数列表集合,任意一个methodParamj表示该方法的第j个形参;
定义4:新旧版本类相似度simCLASS={sc11,sc21,...,scmn};
其中,对于任意scij以键值对形式存储,键格式为classi.className-classj.className,对应的值为新版本的类classi与旧版本的类classj的相似度;
定义5:方法调用树Tree=(M,R),表示程序运行时方法的调用关系,其中M={m1,m2,...,mn}是方法节点集,R是方法调用边的集合;每个边缘rij∈R表示从mi到mj的方法调用,其权重表示mi调用mj的频率;对于任意的mi,存在mi.calli={calli1,calli2,...,callin}表示调用mi的方法集合;存在mi.becalli={becalli1,becalli2,...,becallim}表示mi调用的方法集合;
定义6:新旧版本方法相似度simMETHOD={sm11,cm21,...,smmn};
其中,对于任意smij以键值对形式存储,键格式为mi-mj,对应的值为新版本的方法mi与旧版本的方法mj的相似度;
步骤S22:处理类名,包括:
定义类链表;
加载所有类,放入类链表;
定义类迭代器,包括:
获取类数据结构SootClass;
获取类名;
若该class非被分析Java程序的class,则不记录;
将结果以ClassStructure class形式存储,并保存ci类的类信息;
步骤S23:处理属性,包括:
提取类集合每个类的属性信息;
定义属性信息迭代器,加载类属性信息并遍历:
获取属性信息数据结构;
获取属性名;
获取属性类型;
获取属性权限:
返回值0:默认;返回值1:public;返回值2:private;返回值4:protected;
将结果以FieldStructure class形式存储,并保存ci类的属性信息;
步骤S24:处理方法,包括:
提取类集合/接口集合每个的方法信息;
定义方法信息迭代器,加载类方法信息并遍历,包括:
获取方法信息数据结构;
获取方法权限;
获取返回类型;
获取方法名;
获取参数列表;
对于方法的参数分个存储;
将结果以MethodStructure class形式存储,并保存ci类的方法信息;
步骤S25:处理继承关系,包括:
定义继承关系存储结构;
格式为:父类|--子类;
获取某个类的父类并存储继承关系;
步骤S26:处理实现关系,包括:
定义实现关系存储结构;
获取某个类的接口;
生成迭代器并存储实现关系;
步骤S27:处理关联关系,包括:
定义关联关系存储结构;
判断是否存在关联关系:
判断是否为1对1;
判断是否为1对多;
步骤S28:处理依赖关系,包括:
定义依赖关系存储结构;
获取依赖关系;
步骤S29:处理调用关系树,包括以下步骤:
第一步:
获得Uij.ValueBox左半部分;
获得Uij.ValueBox右半部分;
第二步:
如果是赋值语句且存在方法调用,则:
获取被调用方法,并记录调用信息;
如果是调用语句,则:
获取被调用方法,并记录调用信息;
第三步:
构造InvokeTree;
步骤S3当中通过预定义的类相似度评判因素计算相似度具体包括以下步骤:
以类classi和classj的类名、属性个数、方法个数、相似属性占比、相似方法占比5个评判因素计算类classi和classj的相似度:
scij=0.1*r1ij+0.2*r2ij+0.2*r3ij+0.25*r4ij+0.25*r5ij;
其中,fnumi为classi中属性的数量,fnumj为classj中属性的数量,mnumi为classi中方法的数量,mnumj为classj中方法的数量,fnumij为classi与classj中相同属性的个数,mnumij为classi与classj中相同方法的个数;
步骤S4当中通过预定义的方法相似度评判因素计算相似度具体包括以下步骤:
以方法mi和mj的所属类两者之间的相似度、方法被调用的次数、方法调用其他方法的次数、调用mi的方法集合mi.call和调用mj的方法集合mj.call中存在映射关系的方法对占比、mi调用的方法集合mi.becall和mj调用的方法集合mj.becall中存在映射关系的方法对占比、方法签名6个评判因素计算方法mi和mj的相似度:
smij=0.15*p1ij+0.2*p2ij+0.2*p3ij+0.15*p4ij+0.15*p5ij+0.15*p6ij;
p1ij=scab;
p6ij=0.8*sim1ij+0.2*sim2ij;
其中,becallmij为mi.becall和mj.becall中存在映射关系的方法对个数,becallnumij为mi.becall或mj.becall的元素个数,callmij为mi.call和mj.call中存在映射关系的方法对个数,callnumij为mi.call或mj.call的元素个数。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于福州大学,未经福州大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201911138413.5/1.html,转载请声明来源钻瓜专利网。
- 上一篇:一种页岩油气储层压裂用无水泡沫发生器及其应用
- 下一篇:一种系泊式海浪发电机





