提问人:Thejesh GN 提问时间:8/21/2008 最后编辑:CommunityThejesh GN 更新时间:3/11/2017 访问量:1145
在 Java 中执行 RFC 计算的算法
Algorithm to perform RFC calculation in Java
问:
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();
这变成了两个方法调用
您还能想到哪些其他方法调用模式?除了使用正则表达式之外,还有其他方法可以用来计算 R 吗?
更新:
@McDowell 看起来使用 BCEL 我可以简化整个过程。让我试试看。
答:
您应该在 Java 语言规范中找到答案。
你忘记了静态方法调用,方法调用在参数里面......
使用反射调用方法(方法的名称在字符串中)。
您可以将字节码工程库与二进制文件一起使用。可以使用 DescendingVisitor 访问类的成员和引用。我用它来查找类依赖关系。
或者,您可以重用源文件的某些模型。我很确定 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() 函数中的调用)。是否要包括对内部类的调用,或对内部类中主类的调用?是否要包含对同一类中其他方法的调用?
如果您正在查看任何方法调用,无论来源如何,那么正则表达式可能会起作用,但要正确处理会很棘手(您的正则表达式是否正确忽略了包含类似方法调用内容的字符串?它是否正确处理构造函数调用?如果你关心方法调用的来源,那么正则表达式可能不会得到你想要的东西。你需要使用反射(尽管不幸的是,我对反射的了解还不够多,无法在那里提供帮助)。
评论