在Java中执行RFC计算的算法
-
09-06-2019 - |
题
Java 类的 RFC 是可以调用以响应发送给该类对象的消息或由该类中的某些方法调用的所有方法。rfc = m + r,其中m =类中的方法数。R = 从 M 直接调用的其他方法总数。
认为C是.class,J是我们需要计算RFC的.java文件。
class J{ a(){} b(){} c(){ e1.e(); e1.f(); e1.g(); } h(){ i.k(); i.j(); } m(){} n(){ i.o(); i.p(); i.p(); i.p(); } }
这里m = 6和r = 9(不必担心在循环中打电话。它被视为单个调用)
计算 M 很容易。使用类加载器加载 C 并使用反射来获取方法的计数。
计算 R 并不直接。我们需要计算类中方法调用的数量。仅限第一级。
为了计算 R 我必须使用正则表达式。通常格式是(不使用 .不计算在内)
[variable_name].[method_name]([zero or more parameters]);
或者
[variable_name].[method_name]([zero or more parameters])
当调用返回时不带分号直接成为另一个方法的参数。或者
[variable_name].[method_name]([zero or more parameters]).method2();
这变成了两个方法调用
您还能想到其他哪些方法调用模式?除了使用 RegEx 之外还有其他方法可以用来计算 R 吗?
更新:
@麦克道尔看起来使用 BCEL 我可以简化整个过程。让我尝试一下。
解决方案
你可以使用 字节码工程库 与二进制文件。您可以使用 降序访客 拜访班级成员和推荐人。我用过它 查找类依赖关系.
或者,您可以重用源文件的某些模型。我很确定 Java 编辑器 Eclipse JDT 由某种形式的模型支持。
其他提示
您应该在以下内容中找到答案 Java语言规范.
你忘记了静态方法调用,参数内的方法调用......
使用反射调用方法(方法的名称位于字符串中)。
M 是否包含对其自身方法的调用?或者调用内部类?例如:
class J {
a() { }
b() { this.a(); }
c() { jj.aa(); }
d() { i.k(); }
e() { this.f().a(); }
f() { return this; }
g() { i.m().n(); }
class JJ {
aa() { a(); }
}
}
这个的 M 值是多少?仅对此类中未定义的方法进行了三个函数调用(d() 和 g() 函数中的调用)。您想要包含对内部类的调用,还是在内部类中对主类的调用?您想在同一类中包含对其他方法的调用吗?
如果您正在查看任何方法调用,无论来源如何,那么正则表达式可能会起作用,但要正确执行会很棘手(您的正则表达式是否正确忽略包含方法调用之类内容的字符串?它是否正确处理构造函数调用?)。如果您关心方法调用的来源,那么正则表达式可能无法满足您的需求。您需要使用反射(尽管不幸的是我对反射的了解不够,因此无法提供帮助)。