4

JavaクラスのRFCは、クラスのオブジェクトへのメッセージに応答して、またはクラス内のメソッドによって呼び出すことができるすべてのメソッドのセットです。RFC = M + Rここで、M=クラス内のメソッドの数。R=Mから直接呼び出された他のメソッドの総数。

Cは.classであり、JはRFCを計算する必要がある.javaファイルであると考えています。

クラスJ{

 a(){}
 b(){}
 c(){
   e1.e();
   e1.f();
   e1.g();
 }
 h(){
   ik();
   ij();
  }
  m(){}
  n(){
   io();
   ip();
   ip();
   ip();
  }
}

ここでM=6およびR=9(ループ内の呼び出しについて心配する必要はありません。単一の呼び出しと見なされます)

Mの計算は簡単です。クラスローダーを使用してCをロードし、リフレクションを使用してメソッドの数を取得します。

Rの計算は直接ではありません。クラスからのメソッド呼び出しの数を数える必要があります。最初のレベルのみ。

RIの計算には、正規表現を使用する必要があります。通常、形式は次のようになります(。を使用しない呼び出しはカウントされません)

[variable_name]。[method_name]([0個以上のパラメーター]);

また

[variable_name]。[method_name]([0個以上のパラメーター])

コールリターンが直接別のメソッドのパラメータになる場合、セミコロンなし。また

[variable_name]。[method_name]([0個以上のパラメーター])。method2();

これは2つのメソッド呼び出しになります

メソッド呼び出しの他のどのパターンを考えることができますか?Rの計算に使用できるRegExを使用する以外の方法はありますか?


更新:
@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値は何でしょうか?このクラスで定義されていないメソッドへの関数呼び出しは3つだけです(d()およびg()関数の呼び出し)。内部クラスへの呼び出し、または内部クラスで行われたメインクラスへの呼び出しを含めますか?同じクラスの他のメソッドへの呼び出しを含めますか?

ソースに関係なく、メソッド呼び出しを調べている場合、正規表現はおそらく機能しますが、正しく理解するのは難しいでしょう(正規表現は、メソッド呼び出しのようなコンテンツを含む文字列を適切に無視しますか?コンストラクター呼び出しを適切に処理しますか? ?)。メソッド呼び出しのソースを気にする場合、正規表現はおそらくあなたが望むものを取得しません。リフレクションを使用する必要があります(残念ながら、リフレクションについては、そこで役立つほど十分にわかりません)。

于 2008-08-21T14:05:49.813 に答える