Java类的RFC是为了响应对类的对象的消息或类中的某个方法而调用的所有方法的集合.
RFC = M R在哪里
M =班级中的方法数量.
R =从M.直接调用的其他方法的总数.
Thinking 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])
当调用return直接成为另一个方法的参数时,用分号分隔.
要么
[variable_name].[method_name]([zero or more parameters]).method2();
这变成了两个方法调用
你能想到的方法调用的其他模式是什么?除了使用可用于计算R的RegEx之外,还有其他方法吗?
更新:
@McDowell
看起来像使用BCEL我可以简化整个过程.让我试一试.
最佳答案 您可以将
Byte Code Engineering Library与二进制文件一起使用.您可以使用
DescendingVisitor访问班级的成员和参考.我用它到
find class dependencies.
或者,您可以重用某些源文件模型.我很确定Eclipse JDT中的Java编辑器是由某种形式的模型支持的.