首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用BCEL生成的解析字节码确定对象之间的传出耦合(CBO度量)

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

Stack Overflow用户
提问于 2017-05-19 13:05:38
回答 1查看 468关注 0票数 1

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

EN

回答 1

Stack Overflow用户

发布于 2017-05-19 15:00:36

set可以是目录的内容、jar文件的内容或类路径中的所有类的内容。

我会用类名作为键填充一个Map,以及它引用的类:

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
            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);
                }
            }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44061843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档