一种Java类依赖关系的静态识别方法技术

技术编号:14884570 阅读:90 留言:0更新日期:2017-03-25 00:52
本发明专利技术公开了一种Java类依赖关系的静态识别方法,包括:1)对基于Java开发的Web应用的代码文件展开静态分析,构建代码中方法、变量和属性之间的依赖关系图;2)基于依赖关系图,自动识别Web应用中存在读写共享的持久化属性。本发明专利技术为自动检测Web应用是否可以集群部署提供了静态分析方法,可以覆盖待检测Web应用中所有可能的执行路径,并且不会引入任何代码污染。

【技术实现步骤摘要】

本专利技术涉及一种Java类依赖关系的静态识别方法,可以针对用户提供的基于Java的Web应用,通过静态代码分析,快速地构建出所有类、字段之间的依赖关系,并从中自动识别存在读写共享的持久化属性,这在自动检测Web应用是否可以集群部署,以及Web应用的集群迁移方面具有重要作用,属于软件应用

技术介绍
为了满足不断增长的海量信息以及数据处理的需求,计算机集群技术应运而生。集群技术通过将多台计算机连接在一起,按照一定的规则进行协同工作来完成单台计算机无法完成的任务。通过集群,可以以较低的成本搭建拥有强大计算能力的系统,并且其性能、扩展性和可用性都得以大大增强。集群对象的共享是集群技术中的一个关键问题——所谓集群对象,就是那些虽然物理上分布于不同的机器,但是逻辑上具有同一性的那些对象,在集群外部看来它们表示同一个对象。由于集群对象维护的是集群中不同服务器之间的协同工作的数据,它们的正确共享是业务逻辑正常运行的重要保证。针对Java系统,在集群的搭建过程中,为了使普通的Java对象成为集群对象,实现集群对象的正确共享,需要针对所有共享的Java类进行存取方式上的重构,即,将单机式的数据读写方式转换成集群式的数据读写方式。如果某个共享属性没有被正确地重构,那么它便无法拥有集群的行为。这意味着要从所有的Java类中定位存在读写共享的持久化属性。在Java系统中,动态分析,或运行时分析,可以在一定程度上解决共享属性的搜索和推导问题。然而在动态分析中,系统的运行必须要覆盖所有可能的代码路径——包括正常情况和异常情况,否则便无法保证找出的共享属性的集合的完备性,这就相当于要进行一次完备的软件测试,难度相对较大。并且,为了获取某个Java对象属性的引用和依赖信息,需要在原系统代码中插入Java反射机制的代码,这无疑给原系统带来了不少的代码污染,这些源代码污染带来了一定的重构风险。因此,为了更加方便、快捷、高效、完备地进行集群对象共享的配置,需要一种Java类依赖关系的静态识别方法,该方法可以覆盖所有的执行路径,并且避免代码污染。
技术实现思路
本专利技术的目的在于克服现有技术中存在的问题,提供一种Java类依赖关系的静态识别方法,该方法利用静态程序分析技术对用户指定的Web应用中包含的全部代码进行分析,可以覆盖所有的执行路径,并且分析过程中无须对原始代码进行插装,从而不会对原系统造成任何代码污染。本专利技术适用于自动检测Web应用是否可以集群部署,并可用于指导开发人员对Web应用进行集群迁移,可以提高Web应用集群迁移的整体效率。为了实现本专利技术的目的,采用的技术方案概述如下:一种基于静态程序分析的共享持久化属性识别方法,如图1所示,包括以下步骤:步骤1:分析用户指定的目标Web应用的代码,从中识别目标Web应用的入口方法,并将识别得到的入口方法置入待分析方法集合中;步骤2:依次分析待分析方法集合中的每个入口方法,建立入口方法内部定义的变量、引用的属性和被调用的方法间的依赖关系,得到入口方法内部的依赖关系图;并利用相同的步骤对入口方法调用的其他方法进行分析;分析完成后,将所有被分析的被调用方法置如已分析方法集合中;步骤3:依次分析已分析方法集合中的每个被调用方法,对于被调用方法的每次调用,建立方法调用时传入的实际参数和被调用方法定义的形式参数间的依赖关系,从而得到完整的依赖关系图;步骤4:遍历步骤3得到的依赖关系图,从中搜索持久化结点,并将其对应的元素置于持久化元素集合中;持久化元素指在Java中被声明为静态的属性、变量或方法,但在依赖关系图中被非静态的属性、变量或方法依赖的元素;步骤5:依次以步骤4得到的持久化元素集合中的元素为起点,对步骤3得到的依赖关系图进行遍历,位于2个持久化元素之间的属性即被识别为持久化属性,将识别得到的持久化属性置于持久化属性集合中,并最终输出。所述步骤1中,由用户提供目标Web应用程序源码,初始化待分析方法集合Su为空;遍历程序源码,从中识别系统的入口方法,入口方法包括所有实现了标准Servlet接口的Java类中的doGet、doPost方法,并将这些方法置入待分析方法集合Su中。所述步骤2具体包括以下步骤,(1)初始化已分析方法集合Sa为空;(2)从待分析方法集合Su中取出一个方法M,(2.1)如果方法M不是静态方法,即M没有被声明为static的,则按照如下规则依次对方法包含的每条指令进行分析:o)如果当前指令是属性读指令,操作属性为P,则添加依赖关系M依赖于P;p)如果当前指令是静态属性读指令,操作属性为P,则添加依赖关系M依赖于P,并设置P为持久化元素;q)如果当前指令是属性写指令,操作属性为P,则添加依赖关系P依赖于M;r)如果当前指令是静态属性写指令,操作属性为P,则添加依赖关系P依赖于M,并设置P为持久化元素;s)如果当前指令是赋值指令,一侧操作元素为变量L,另一侧操作元素集合为Rs,且Rs中包括静态属性集合Rsp,则添加依赖关系L依赖于Rs,L依赖于M,并设置Rsp中元素为持久化元素;t)如果当前指令是返回指令,返回元素为R,R是非静态属性或变量,则添加依赖关系M依赖于R;u)如果当前指令是返回指令,返回元素为R,R是静态属性,则添加依赖关系M依赖于R,并设置R为持久化元素;v)如果当前指令是方法调用指令,被调用的方法N是非静态方法,则添加依赖关系M依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sc中;w)如果当前指令是方法调用指令,被调用的方法N是静态方法,则添加依赖关系M静态依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sn中,并设置N为持久化元素;(2.2)如果方法M是静态方法,则按照如下规则依次对方法包含的每条指令进行分析:x)如果当前指令是属性读指令,操作属性为P,则添加依赖关系M依赖于P;y)如果当前指令是属性写指令,操作属性为P,则添加依赖关系P依赖于M;z)如果当前指令是赋值指令,一侧操作元素为变量L,另一侧操作元素集合为Rs,则添加依赖关系L依赖于Rs,L依赖于M;aa)如果当前指令是返回指令,返回元素为R,则添加依赖关系M依赖于R;bb)如果当前指令是方法调用指令,被调用的方法为N,则添加依赖关系M依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sc中;(3)将方法M置入已分析方法集合Sa中;(4)返回步骤(2)继续处理Su,直到Su为空。所述步骤3具体包括以下步骤:(1)从已分析方法集合Sa中取出一个方法M;(2)获取M的调用集合Sc;(3)从调用集合Sc中取出一次调用指令C;(4)建立调用指令C中传入的实际参数和方法M定义的形式参数间的依赖关系,对于调用指令C中的每个实际参数A,找出其对应的形式参数P;如果A是对象的静态属性,则添加依赖关系P静态依赖于A,否则添加依赖关系P依赖于A;(5)返回步骤(3)继续处理Sc,直到集合Sc为空;(6)返回步骤(1)继续处理Sa,直到集合Sa为空。所述步骤4具体包括以下步骤:(1)初始化持久化结点集合Ns为空;(2)获取步骤3构建的属性依赖图中的结点集合Ne;(3)从结点集合Ne中取出一个结点n,本文档来自技高网
...
一种Java类依赖关系的静态识别方法

【技术保护点】
一种Java类依赖关系的静态识别方法,其特征在于包括以下步骤:步骤1:分析用户指定的目标Web应用的代码,从中识别目标Web应用的入口方法,并将识别得到的入口方法置入待分析方法集合中;步骤2:依次分析待分析方法集合中的每个入口方法,建立入口方法内部定义的变量、引用的属性和被调用的方法间的依赖关系,得到入口方法内部的依赖关系图;并利用相同的步骤对入口方法调用的其他方法进行分析;分析完成后,将所有被分析的被调用方法置如已分析方法集合中;步骤3:依次分析已分析方法集合中的每个被调用方法,对于被调用方法的每次调用,建立方法调用时传入的实际参数和被调用方法定义的形式参数间的依赖关系,从而得到完整的依赖关系图;步骤4:遍历步骤3得到的依赖关系图,从中搜索持久化结点,并将其对应的元素置于持久化元素集合中;持久化元素指在Java中被声明为静态的属性、变量或方法,但在依赖关系图中被非静态的属性、变量或方法依赖的元素;步骤5:依次以步骤4得到的持久化元素集合中的元素为起点,对步骤3得到的依赖关系图进行遍历,位于2个持久化元素之间的属性即被识别为持久化属性,将识别得到的持久化属性置于持久化属性集合中,并最终输出。...

【技术特征摘要】
1.一种Java类依赖关系的静态识别方法,其特征在于包括以下步骤:步骤1:分析用户指定的目标Web应用的代码,从中识别目标Web应用的入口方法,并将识别得到的入口方法置入待分析方法集合中;步骤2:依次分析待分析方法集合中的每个入口方法,建立入口方法内部定义的变量、引用的属性和被调用的方法间的依赖关系,得到入口方法内部的依赖关系图;并利用相同的步骤对入口方法调用的其他方法进行分析;分析完成后,将所有被分析的被调用方法置如已分析方法集合中;步骤3:依次分析已分析方法集合中的每个被调用方法,对于被调用方法的每次调用,建立方法调用时传入的实际参数和被调用方法定义的形式参数间的依赖关系,从而得到完整的依赖关系图;步骤4:遍历步骤3得到的依赖关系图,从中搜索持久化结点,并将其对应的元素置于持久化元素集合中;持久化元素指在Java中被声明为静态的属性、变量或方法,但在依赖关系图中被非静态的属性、变量或方法依赖的元素;步骤5:依次以步骤4得到的持久化元素集合中的元素为起点,对步骤3得到的依赖关系图进行遍历,位于2个持久化元素之间的属性即被识别为持久化属性,将识别得到的持久化属性置于持久化属性集合中,并最终输出。2.根据权利要求1所述的一种Java类依赖关系的静态识别方法,其特征在于:所述步骤1中,由用户提供目标Web应用程序源码,初始化待分析方法集合Su为空;遍历程序源码,从中识别系统的入口方法,入口方法包括所有实现了标准Servlet接口的Java类中的doGet、doPost方法,并将这些方法置入待分析方法集合Su中。3.根据权利要求1所述的一种Java类依赖关系的静态识别方法,其特征在于:所述步骤2具体包括以下步骤,(1)初始化已分析方法集合Sa为空;(2)从待分析方法集合Su中取出一个方法M,(2.1)如果方法M不是静态方法,即M没有被声明为static的,则按照如下规则依次对方法包含的每条指令进行分析:a)如果当前指令是属性读指令,操作属性为P,则添加依赖关系M依赖于P;b)如果当前指令是静态属性读指令,操作属性为P,则添加依赖关系M依赖于P,并设置P为持久化元素;c)如果当前指令是属性写指令,操作属性为P,则添加依赖关系P依赖于M;d)如果当前指令是静态属性写指令,操作属性为P,则添加依赖关系P依赖于M,并设置P为持久化元素;e)如果当前指令是赋值指令,一侧操作元素为变量L,另一侧操作元素集合为Rs,且Rs中包括静态属性集合Rsp,则添加依赖关系L依赖于Rs,L依赖于M,并设置Rsp中元素为持久化元素;f)如果当前指令是返回指令,返回元素为R,R是非静态属性或变量,则添加依赖关系M依赖于R;g)如果当前指令是返回指令,返回元素为R,R是静态属性,则添加依赖关系M依赖于R,并设置R...

【专利技术属性】
技术研发人员:王帅杨燕徐良田申
申请(专利权)人:中国科学院软件研究所
类型:发明
国别省市:北京;11

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

1