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 个软件的基本信息, 包括项目名称、版本号、代码行的数量、包的数量、类的数量、方法/

