当前位置: 首页 > 专利查询>福州大学专利>正文

建立不同版本程序类集合映射关系的方法技术

技术编号:23557772 阅读:44 留言:0更新日期:2020-03-25 03:30
本发明专利技术提出一种建立不同版本程序类集合映射关系的方法,首先,确定类相似度和方法相似度的评判因素;其次从源代码逆向工程建立类图;最后通过一系列的算法分析(包括计算初步类相似度、方法相似度以及迭代确立方法和类的最终相似度)建立不同版本间程序的类集合中类的“一对一”、“一对多”、“多对一”的映射关系以及类中方法的“一对一”映射。能够解决由于人工阅读源代码等方式寻找不同版本系统类集合间的映射关系难以实施的问题,直观反映系统的体系结构,增加了代码的可读性和可维护性,降低软件开发人员和维护人员理解不同版本间系统的难度,提供了一个在较高层次观察不同系统的方法。

The method of establishing the mapping relationship between different versions of program class set

【技术实现步骤摘要】
建立不同版本程序类集合映射关系的方法
本专利技术属于计算机软件
,尤其涉及一种建立不同版本程序,尤其是Java程序的类集合映射关系的方法。
技术介绍
面向对象技术自从提出以来就成为了研究的热点。迄今为止,面向对象已经逐渐渗透到了软件开发的各个层次和方面,出现了包括面向对象分析、设计和程序设计等面向对象的方法。软件演化是指软件进行渐变并达到所希望形态的过程。软件演化对延长软件寿命起着重要作用,软件程序经过演化后效率会被提高,缺陷将得到修正。软件维护和演化是不可避免的,但有时候项目人员并不只想要获得演化后的程序,更多地,他们渴望获取的是演化后不同版本程序的差异。对软件的演化分析可以帮助对不同版本程序差异的全面理解,而对各个版本的程序的全面理解和对不同版本程序差异的全面理解是程序维护的基础,然而演化后的程序由于结构复杂且联结,代码量巨大,通过阅读源代码的方式来分析程序演化信息的方式是艰难而不理智的行为。虽然面向对象技术使得程序的可维护性有了显著的提高,但由于目前对不同版本的程序进行演化分析需要借助于不同版本的程序的开发文档或者变更记录,本文档来自技高网...

【技术保护点】
1.一种建立不同版本程序类集合映射关系的方法,其特征在于,包括以下步骤:/n步骤S1:获取同一程序两个不同版本的源代码;/n步骤S2:根据步骤1的两个不同版本的源代码通过代码分析获取数据结构信息和类与类之间的关系,以及类中方法与方法间的调用关系,生成类图;/n步骤S3:计算初步类相似度:通过步骤S2获得的信息建立两个版本程序类集合的模型信息,以其中一个版本程序的类集合为类集合A,通过预定义的类相似度评判因素计算相似度,确定被映射版本程序类集合B中每个类在类相似度评判因素下对类集合A每个类的相似度;/n步骤S4:计算方法相似度:通过步骤S2获得的信息建立两个版本方法集合的模型信息,以其中一个版本...

【技术特征摘要】
1.一种建立不同版本程序类集合映射关系的方法,其特征在于,包括以下步骤:
步骤S1:获取同一程序两个不同版本的源代码;
步骤S2:根据步骤1的两个不同版本的源代码通过代码分析获取数据结构信息和类与类之间的关系,以及类中方法与方法间的调用关系,生成类图;
步骤S3:计算初步类相似度:通过步骤S2获得的信息建立两个版本程序类集合的模型信息,以其中一个版本程序的类集合为类集合A,通过预定义的类相似度评判因素计算相似度,确定被映射版本程序类集合B中每个类在类相似度评判因素下对类集合A每个类的相似度;
步骤S4:计算方法相似度:通过步骤S2获得的信息建立两个版本方法集合的模型信息,以其中一个版本程序的方法集合为方法集合A,通过预定义的方法相似度评判因素计算相似度,确定被映射版本程序方法集合B中每个方法在方法相似度评判因素下对方法集合A每个方法的相似度;
步骤S5:建立映射关系:取具有最高相似度的方法对,建立方法的“一对一”映射;根据方法的映射关系,通过逐步迭代的方式调整类的相似度,并最终确定类间的相似度。


2.根据权利要求1所述的建立不同版本程序类集合映射关系的方法,其特征在于:所述程序为Java程序。


3.根据权利要求2所述的建立不同版本程序类集合映射关系的方法,其特征在于:所述类相似度评判因素包括:类名、属性个数、方法个数、相似属性占比和相似方法占比;所述方法相似度评判因素包括:方法所属类两者之间的相似度、该方法被调用的频率、该方法调用其他方法的频率、调用这两个方法的方法集合中存在映射关系的方法对占比、这两个方法调用的方法集合中存在映射关系的方法对占比和方法签名。


4.根据权利要求2所述的建立不同版本程序类集合映射关系的方法,其特征在于:步骤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:处理类名
//定义类链表
Chain<SootClass>classes=null;
//加载所有类,放入类链表classes=Scene.v().getApplicationClasses();
//定义类迭代器
Iterator<SootClass>iterator=classes.iterator();
while(iterator.hasNext())
do{
SootClasssootClass=iterator.next();//类数据结构SootClass
Classci=newClassStructure();//以ClassStructureclass形式存储
Stringclassname=sootClass.getName;//获取类名
//若该class非被分析Java程序的class,则不记录
if(!classname.contains(packagename))continue;
ci.className=classname;
}
setList(CLASS,ci);
步骤S23:处理属性
//提取类集合每个类的属性信息
for(ci:CLASS){
//定义属性信息迭代器,加载类属性信息并遍历
Iterator<SootField>fieldIteratorerator=ci.getFields().iterator();
while(fieldIteratorerator.hasNext())
do{
SootFields=fieldIterator.next();//属性信息数据结构
Stringname=s.getName();//属性名Stringtype=s.getType().toString();//属性类型intmodifiers=s.getModifiers();//属性权限
//返回值0:默认;返回值1:public;返回值2:private;返回值4:protected
//以FieldStructureclass形式存储
Fieldfij=newFieldStructure();
fij.fieldModifiers=String.valueOf(modifiers);fij.fieldType=type;fij.fieldName=name;ci.FIELD.add(fij);//保存ci类的属性信息}
}
步骤S24:处理方法
//提取类集合/接口集合每个的方法信息
for(ci:classlist||ci:interfacelist){
//定义方法信息迭代器,加载类方法信息并遍历
Iterator<SootMethod>methodIterator=ci.getMethods().iterator();
while(methodIterator.hasNext())
do{
SootMethods=methodIterator.next();//方法信息数据结构
intmodifiers=s.getModifiers();//方法权限TypereturnType=s.getReturnType();//返回类型
Stringname=s.getName();//方法名List<Type>paramTypes=s.getParameterTypes();//参数列表
//以MethodStructureclass形式存储
Methodmij=newMethodStructure();mij.methodModifiers=String.valueOf(modifiers);mij.methodReturnType=String.valueOf(returntype);mij.methodName=name;
//对于方法的参数应该分个存储
for(Typettemp:paramTypes)
mij.METHODPARAM.add(String.valueOf(ttemp));
ci.METHOD.add(mij);//保存ci类的方法信息}
}
步骤S25:处理继承关系
//定义继承关系存储结构
List<String>e...

【专利技术属性】
技术研发人员:陈星陈晓娜胡传淑敏郭莹楠陈艳
申请(专利权)人:福州大学
类型:发明
国别省市:福建;35

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1