代码之家  ›  专栏  ›  技术社区  ›  Thejesh GN

Java中实现RFC计算的算法

  •  4
  • Thejesh GN  · 技术社区  · 18 年前

    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,我必须使用regex。通常格式为(不使用的调用)。不计算在内)

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

    或

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

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

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

    这将成为两个方法调用

    您能想到方法调用的其他模式吗?除了使用regex以外,还有其他方法可以用来计算r吗?


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

    4 回复  |  直到 9 年前
        1
  •  2
  •   McDowell rahul gupta    18 年前

    你可以用 Byte Code Engineering Library 使用二进制文件。你可以使用 DescendingVisitor 访问班级成员和参考资料。我用过它 find class dependencies .

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

        2
  •  0
  •   Nicolas    18 年前

    你应该在 Java language specification .

    您忘记了静态方法调用,参数中的方法调用…

        3
  •  0
  •   kokos    18 年前

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

        4
  •  0
  •   Herms    18 年前

    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()函数中的调用)。您想包括对内部类的调用还是对内部类中的主类的调用?是否要包括对同一类上其他方法的调用?

    如果您查看的是任何方法调用,不管其来源如何,那么regex可能可以工作,但很难获得正确的结果(regex是否正确地忽略包含方法调用之类内容的字符串)?它是否正确地处理构造函数调用?)。如果您关心方法调用的源代码,那么正则表达式可能无法满足您的需要。你需要运用反省(不过不幸的是,我对反省的了解还不够,没有足够的帮助)。