在Java中执行RFC计算的算法


2

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]) 

与出分号时调用的返回是直接成为参数的另一方法。 或

 
[variable_name].[method_name]([zero or more parameters]).method2(); 

这变成了两个方法调用

你能想到的是什么方法调用的其他模式?是否有可用于计算R.

比使用正则表达式等任何其他方式

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

2

您可以使用带有二进制文件的Byte Code Engineering Library。您可以使用DescendingVisitor访问班级的成员和参考。我用它来find class dependencies

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


0

你应该在Java language specification找到你的答案。

你已经忘了静态方法调用,里面的参数方法调用...


0

调用方法使用反射(该方法的名称是一个字符串)。


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

如果你正在查看任何方法调用,无论源,然后一个正则表达式可能会工作,但会很难得到正确的(你的正则表达式是否正确地忽略包含方法调用的字符串像内容?正确处理构造函数调用?)。如果你关心方法调用的来源,那么regexes可能不会得到你想要的。你需要使用反射(尽管很遗憾,我对反射的了解不够充分)。