4

Java 类的 RFC 包含所有方法,这些方法可以响应类对象的消息或类中的某些方法调用。RFC = M + R 其中 M = 类中的方法数。R = 从 M 中直接调用的其他方法的总数。

认为 C 是 .class 而 J 是我们需要计算 RFC 的 .java 文件。

J类{

 一种(){}
 b(){}
 C(){
   e1.e();
   e1.f();
   e1.g();
 }
 H(){
   我知道();
   ij();
  }
  m(){}
  n(){
   io();
   ip();
   ip();
   ip();
  }
}

这里 M=6 和 R=9 (不要担心循环内的调用。它被认为是单个调用)

计算 M 很容易。使用类加载器加载 C 并使用反射来获取方法的计数。

计算 R 不是直接的。我们需要计算类的方法调用次数。仅限第一级。

计算 RI 必须使用正则表达式。通常格式是(不使用 . 的调用不计算在内)

[variable_name].[method_name]([零个或多个参数]);

或者

[variable_name].[method_name]([零个或多个参数])

当调用返回直接成为另一个方法的参数时,没有分号。或者

[variable_name].[method_name]([零个或多个参数]).method2();

这变成了两个方法调用

你还能想到什么其他的方法调用模式?除了使用 RegEx 之外,还有其他方法可以用来计算 R。


更新:
@McDowell 看起来使用 BCEL 我可以简化整个过程。让我试试。

4

4 回答 4

2

您可以将字节码工程库与二进制文件一起使用。您可以使用DescendingVisitor访问类的成员和引用。我用它来查找类依赖项

或者,您可以重用源文件的某些模型。我很确定Eclipse JDT中的 Java 编辑器由某种形式的模型支持。

于 2008-08-21T14:01:58.247 回答
0

您应该在Java 语言规范中找到答案。

您忘记了静态方法调用,参数内部的方法调用...

于 2008-08-21T13:57:06.560 回答
0

使用反射调用方法(方法的名称在字符串中)。

于 2008-08-21T13:59:09.283 回答
0

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() 函数中的调用)。你想包括对内部类的调用,还是对内部类中的主类的调用?您想在同一个类中包含对其他方法的调用吗?

如果您正在查看任何方法调用,无论来源如何,那么正则表达式可能会起作用,但要正确处理会很棘手(您的正则表达式是否正确忽略包含类似方法调用内容的字符串?它是否正确处理构造函数调用?)。如果您关心方法调用的来源,那么正则表达式可能不会得到您想要的。您需要使用反射(尽管不幸的是我对反射知之甚少,无法在那里提供帮助)。

于 2008-08-21T14:05:49.813 回答