使用 BCEL 生成的解析字节码确定对象之间的传出耦合(CBO 指标)

2024-04-13

我已经构建了一个程序,它接受提供的“.class”文件并使用 BCEL 解析它,我现在已经学会了如何计算 LCOM4 值。现在我想知道如何计算类文件的CBO(对象之间的耦合)值。我已经搜索了整个网络,试图找到关于它的正确教程,但到目前为止我还无法找到(我也阅读了有关 BCEL 的整个 javadoc,并且在 stackoverflow 上有一个类似的问题,但它已经已删除)。因此,我需要一些有关此问题的帮助,例如一些详细的教程或代码片段,它们可以帮助我了解如何做到这一点。


好的,这里您必须计算整个类集中的类的 CBO。该集合可以是目录、jar 文件或类路径中所有类的内容。

我将使用类名作为键及其引用的类来填充 Map> :

private void addClassReferees(File file, Map<String, Set<String>> refMap)
        throws IOException {
    try (InputStream in = new FileInputStream(file)) {
        ClassParser parser = new ClassParser(in, file.getName());
        JavaClass clazz = parser.parse();
        String className = clazz.getClassName();
        Set<String> referees = new HashSet<>();
        ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool());
        for (Method method: clazz.getMethods()) {
            Code code = method.getCode();
            InstructionList instrs = new InstructionList(code.getCode());
            for (InstructionHandle ih: instrs) {
                Instruction instr = ih.getInstruction();
                if (instr instanceof FieldOrMethod) {
                    FieldOrMethod ref = (FieldInstruction)instr;
                    String cn = ref.getClassName(cp);
                    if (!cn.equals(className)) {
                        referees.add(cn);
                    }
                }
            }
        }
        refMap.put(className, referees);
    }
}

当您在地图中添加了所有类别后,您需要过滤每个类别的裁判,以将它们限制在所考虑的类别集合中,并添加反向链接:

            Set<String> classes = new TreeSet<>(refMap.keySet());
            for (String className: classes) {
                Set<String> others = refMap.get(className);
                others.retainAll(classes);
                for (String other: others) {
                    refMap.get(other).add(className);
                }
            }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 BCEL 生成的解析字节码确定对象之间的传出耦合(CBO 指标) 的相关文章

随机推荐

  • 正则表达式限制字符串大小

    如何限制此正则表达式的字符串大小 a z a z0 9 a z0 9 我只需要添加量词 3 16 撒上一些积极的前瞻 http www regular expressions info lookaround html通过添加来测试字符串的总
  • 令人困惑的苹果应用内购买产品

    我正在创建一个笔记应用程序 例如 iPad 版 Evernote 我决定提供一些应用内购买计划有两个原因 解锁应用程序中的更多功能 应在指定时间段后自动更新 现在我很困惑为此选择哪种类型的应用内购买 我对感兴趣自动续订订阅 访问指南后her
  • SqlCommand.Cancel() 会导致性能提升吗?

    我已经看到它出现在代码中的多个位置 从来没有解释 只是在其上方有一个神秘的注释 包含声明和执行以了解上下文 这只是运行 SqlCommand 的标准过程 SqlCommand cmd new SqlCommand cmd ExecuteRe
  • Swift where 条件检查属性是否已实现

    我刚刚找到了另一种在 Swift 中充分利用协议和协议扩展的方法 即扩展可选协议来添加函数 以便我可以提供默认值 我在这里写了一篇关于此的博客文章 https janthielemann de random stuff providing
  • 获取 DbContext 中当前登录的用户

    出于审计目的 我尝试在 DbContext 中获取当前登录的用户 不过我对此有一些问题 需要考虑以下几点 在 Blazor Server 中我们必须使用 AddDbContextFactory IHttpContextAccessor 在部
  • 如何使用 PHP 从文档中获取数字签名

    我对数字签名这个东西很陌生 我想做的是检查文档是否经过数字签名 如果已签名 则验证签名 我已经搜索了很多 我发现了一些有关验证签名 使用 openssl 的有用主题 但我找不到有关以下内容的任何内容 文档是否已签名 我还在stackover
  • 可以或应该同时运行的 Promise 数量是否有限制?

    令人惊讶的是 谷歌无法返回这个问题的结果 我想知道在排队并等待下一个完成之前可以或应该并行运行多少个承诺 我想这可能取决于用户的互联网 但我认为值得一问 如果它基于用户的 ISP 连接类型 是否有办法在启动队列之前测试发送的理想承诺数量 另
  • 增量数据库字段

    假设我在网站上有一篇文章 我想跟踪该文章的浏览量 在 Articles 表中 有 PK ID int Name nvarchar 50 和 ViewCount int 每次查看页面时 我都会增加 ViewCount 字段 我担心更新字段时发
  • 以编程方式获取 TFS 责任(注释)数据

    我正在尝试为 Team Foundation Server 2010 实现一个插件 该插件将创建有关团队项目中的用户的报告 从概念上讲 为了正确实现此插件 我需要访问与在 Visual Studio 中使用 注释 功能时获得的相同数据 我需
  • Kivy 和 android 共享首选项

    我正在寻找一种从 Kivy 框架在 Android 设备上持久存储设置的方法 我发现 Kivy 文档总体信息丰富 但在这个特定领域含糊不清 它提到了三种方法 抱歉 没有足够的声誉来提供可点击的链接 相对路径kivy org假如 如果有人可以
  • 我们可以同时使用“export default”和“module.exports”吗?

    如何使用export default and module exports在同一个文件中 出口 export default function module exports A B C 如何导入它们 很确定这是不可能的 默认导出基本上与您分
  • 如何在 TypeScript 中实现睡眠功能?

    我正在使用 TypeScript 在 Angular 2 中开发一个网站 我想知道是否有办法实现thread sleep ms 功能 我的用例是在几秒钟后提交表单后重定向用户 这在 JavaScript 中非常简单 但我不确定如何在 Typ
  • 如何在 WebGL 中创建合适的圆角矩形?

    我试图实现答案这个问题 https stackoverflow com questions 43970170 bordered rounded rectangle in glsl但似乎有点问题 如果您打开他们的 ShaderToys 并尝试
  • org.dbunit.dataset.NoSuchTableException,但表存在

    H2 1 4 191 数据库单元 2 5 1 如何解决这个问题 3种情况的代码和结果 org dbunit dataset NoSuchTableException category org dbunit dataset NoSuchTab
  • 为什么我的 wss://(基于 SSL/TLS 的 WebSockets)连接立即断开而不给出任何错误?

    将此发布给遇到同样问题的其他人 我当时正在开发一个浏览器客户端 它使用 stanza io 连接到 XMPP 服务器 在我的例子中是 Prosody 我默认使用 wss 连接 在开发过程中的某个时刻 我的客户端根本无法连接 它会立即无提示地
  • iphone 4.0 以编程方式发送短信

    我正在开发一个简单的应用程序 在其中我需要以编程方式向我的朋友发送短信 所以编写下面的代码来发送短信 MFMessageComposeViewController picker MFMessageComposeViewController
  • 比较 2 个对象数组并删除重复项

    我在 JavaScript 中有 2 个对象数组 想要比较和合并内容并按 id 对结果进行排序 具体来说 生成的排序数组应包含第一个数组中的所有对象 以及第二个数组中具有不在第一个数组中的 id 的所有对象 以下代码似乎有效 减去排序 但必
  • 派生类的初始值设定项列表

    我想要一个派生类 它有一个默认构造函数来初始化继承成员 为什么我可以这样做 class base protected int data class derived public base public derived note data 4
  • wcf 服务不允许 POST

    一般来说 我对 Web 服务还很陌生 并且 我认为 陷入了配置 IIS 和 Web 服务本身的困境 我在 MVS 2010 中创建了一个 wcf Web 服务 并将其托管在 Windows 7 上的 IIS7 5 上 我使用soapUI 4
  • 使用 BCEL 生成的解析字节码确定对象之间的传出耦合(CBO 指标)

    我已经构建了一个程序 它接受提供的 class 文件并使用 BCEL 解析它 我现在已经学会了如何计算 LCOM4 值 现在我想知道如何计算类文件的CBO 对象之间的耦合 值 我已经搜索了整个网络 试图找到关于它的正确教程 但到目前为止我还