Page 193 - 《软件学报》2026年第5期
P. 193

2072                                                       软件学报  2026  年第  37  卷第  5  期


                 通过动态分析的方式进行跟踪和捕获, 原因主要包括两个方面: 首先, 动态分析主要依赖运行时的方法调用信息,
                 而大部分的接口定义往往仅包含了方法的声明                 (抽象方法), 并没有具体的实现逻辑, 因此不会在运行时直接参与
                 方法的调用; 其次, 枚举在运行时往往是作为常量来使用, 如果枚举没有定义任何方法, 那么它就不会直接参与到
                 方法的调用中. 当然对于包含了默认或静态方法的接口, 以及包含了方法的枚举, 动态分析仍然是可以捕获的. 在
                 本文中, 我们使用动态分析获得的类集对排序的结果进行优化. 如果动态分析过程中缺失了一些比较重要的类                                   (抽
                 象类)、接口、枚举, 这可能会对排序结果产生一定的影响. 因此, 为了尽量消除这种影响, 我们将对直接动态分析
                 获得的类集进行扩充, 即将那些无法直接捕获的抽象类、接口和枚举加进来.
                    类集的扩充依赖于前面静态分析收集的软件结构信息以及构建的                       CCN. 具体如下.
                    ● 接口  (或抽象) 类的扩充: 静态分析通过识别代码中的“implements”和“extends”关键字, 可以准确识别类与抽
                 象类、接口与接口之间的继承关系, 以及类与接口之间的实现关系, 并得到完整的继承和实现链. 我们基于静态分
                 析得到   CCN, 并以动态分析识别出的类为起点, 沿着静态关系               (implements 和  extends) 结构向上追溯, 找到其直接
                 或间接实现的接口及其继承链上的抽象类, 将它们扩充到类集中. 以图                      5(a) 代码中的类   Catalog  为例, 从  CCN  中
                 我们能识别出类      Catalog  实现了接口  CatalogInterface 这一关系, 即使在动态分析中    CatalogInterface 接口并未直接
                 出现在方法调用链上, 我们仍然可以将接口              CatalogInterface 与类  Catalog  进行关联, 并扩充到类集中.
                    ● 枚举的扩充: 我们基于静态分析收集的软件结构信息及构建的                    CCN, 从中识别出动态分析中捕获的所有类,
                 并进一步分析这些类在其实现中是否直接或间接使用了枚举. 由于枚举类通常以常量的形式被使用, 因此我们只
                 需要通过查找类的       ACC  关系  (属性访问关系) 来寻找潜在的枚举使用情况. 例如, 当某个方法直接调用了某枚举
                 的常量, 或者通过调用链间接依赖了枚举类型的字段或方法, 我们便可以将该枚举扩充到类集中.
                    ⑤ 微调排序结果
                    我们使用扩充后的类集对排序结果进行微调, 即对于在初步排序中排在前                          k×|V| (k 为百分比) 或前  k (k 为整
                 数) 的类, 从头开始依次检查每个类, 若该类不存在于扩充后的类集中, 则将其与前                        k×|V|+1  或前  k+1  位置的类进
                 行交换, 以期将重要的类往前移动, 从而提高真正的关键类出现在前                    k×|V|或前  k 个类中的概率.

                  2   实验设计

                    为了检验    CDAG  方法在软件关键类识别上的有效性, 我们设计了一系列的实验. 在本文中, CDAG                       方法是使
                 用  JDK 17.0.9  和  Eclipse 4.30.0  开发的, 所有的实验是在一台装有  Windows 11 64  位操作系统、2.60 GHz 的  13th
                 Gen Intel(R) Core(TM) i9-13900H CPU  和  32 GB  内存的  ThinkPad  笔记本上实施的.
                    第  2.1  节描述实验对象. 第   2.2  节介绍对比方法. 第    2.3  节描述用于评估方法效果的度量指标. 第          2.4  节描述实
                 验的结果及对结果的分析. 第         2.5  节对结果的有效性进行分析.
                  2.1   实验对象
                    文献  [10] 收集了现有关键类识别研究中使用的所有软件, 构建了一个包含                    18  个  Java 软件及其关键类的数据
                 集. 据我们所知, 这是迄今为止最大规模的关键类识别数据集. 本文从该数据集中筛选出了                           8  个软件作为本文的实
                 验对象. 我们未选用其余的        10  个软件, 主要出于以下      4  点原因: 1) 用户操作手册的质量比较低         (对软件操作过程
                 没有详细说明), 甚至缺失; 2) 缺失       (或无法找到) 软件运行必须的文件或依赖库; 3) JDK            版本过早, 无法兼容当前
                 运行环境; 4) 非  GUI 系统缺少内置的测试用例         (或内置的测试用例极少).
                    本文使用的软件如表         3  所示. 其中, argoUML  是一款开源的     UML  建模工具, 用于创建和编辑        UML  图形;
                 jEdit 是一款开源的程序员文本编辑器, 支持多种编程语言的语法高亮和插件扩展; jHotDraw                     是一款   Java 框架, 用
                 于创建   2D  图形应用程序, 并提供了图形编辑功能; jMeter 是一款开源的            Java 应用程序, 用于负载测试和性能测量;
                 Mars 是一个开源    Java  项目, 致力于构建计算机模型, 以模拟和探索在火星上建立人类定居点的各种关键要素;
                 Maze 是一款用   Java 实现的迷宫游戏; PDFBox    是一个   Java 库, 用于创建、操作和提取       PDF  文档内容; wro4j 是一
                 个  Web  资源优化框架, 用于压缩和管理        JavaScript 和  CSS  资源.
                    表  3 还给出了这   8 个软件的基本信息, 包括项目名称、版本号、代码行的数量、包的数量、类的数量、方法/
   188   189   190   191   192   193   194   195   196   197   198