gpt4 book ai didi

java - 通过使用 BCEL 解析 Java 字节码来确定 LCOM4(方法中缺乏内聚)

转载 作者:行者123 更新时间:2023-12-02 02:49:42 33 4
gpt4 key购买 nike

我已经构建了一个程序,它接受提供的“.class”文件并使用 BCEL 解析它,但是当涉及到使用结果对象来确定 LCOM4 值时,我有点迷失了。我已经搜索了整个网络,试图找到关于它的正确教程,但到目前为止我还无法找到(我也阅读了有关 BCEL 的整个 javadoc)。因此,我需要一些有关此问题的帮助,例如一些详细的教程或代码片段,它们可以帮助我了解如何做到这一点。

最佳答案

好的,让我们定义一个类来表示一组字段和方法:

public class Group {
private final Set<String> fields = new HashSet<>();
private final Set<String> methods = new HashSet<>();

public Group addFields(String...fields) {
for (String field: fields) {
this.fields.add(field);
}
return this;
}

public Group addMethods(String... methods) {
for (String method: methods) {
this.methods.add(method);
}
return this;
}

public int fields() {
return fields.size();
}

public int methods() {
return methods.size();
}

public boolean intersects(Group other) {
for (String field: other.fields) {
if (fields.contains(field)) {
return true;
}
}
for (String method: other.methods) {
if (methods.contains(method)) {
return true;
}
}
return false;
}

public void merge(Group other) {
fields.addAll(other.fields);
methods.addAll(other.methods);
}

@Override
public String toString() {
return "Group{" + "fields=" + fields + ", methods=" + methods + '}';
}
}

我们首先使用类中定义的每个字段的组填充组列表,然后,对于每个方法,我们使用代码中引用的字段和方法构建一个组,然后减少列表通过合并和删除与该方法的组相交的每个组来进行分组。

这是加载类组的 java 代码。 LCOM4是groups.size():

private List<Group> loadGroups(File file) throws IOException {
try (InputStream in = new FileInputStream(file)) {
ClassParser parser = new ClassParser(in, file.getName());
JavaClass clazz = parser.parse();
String className = clazz.getClassName();
ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool());
List<Group> groups = new ArrayList<Group>();
for (Field field: clazz.getFields()) {
groups.add(new Group().addFields(field.getName()));
}
for (Method method: clazz.getMethods()) {
Group group = new Group().addMethods(method.getName());
Code code = method.getCode();
InstructionList instrs = new InstructionList(code.getCode());
for (InstructionHandle ih: instrs) {
Instruction instr = ih.getInstruction();
if (instr instanceof FieldInstruction) {
FieldInstruction fld = (FieldInstruction)instr;
if (fld.getClassName(cp).equals(className)) {
group.addFields(fld.getFieldName(cp));
}
} else if (instr instanceof InvokeInstruction) {
InvokeInstruction inv = (InvokeInstruction)instr;
if (inv.getClassName(cp).equals(className)) {
group.addMethods(inv.getMethodName(cp));
}
}
}
if (group.fields() > 0 || group.methods() > 1) {
int i = groups.size();
while (i > 0) {
--i;
Group g = groups.get(i);
if (g.intersects(group)) {
group.merge(g);
groups.remove(i);
}
}
groups.add(group);
}
}
return groups;
}
}

关于java - 通过使用 BCEL 解析 Java 字节码来确定 LCOM4(方法中缺乏内聚),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44040918/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com