JavaでRFC計算を実行するアルゴリズム


2

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

Thinking Cは.classであり、Jは.javaファイルであり、RFCを計算する必要があります。ここ

 
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()関数の呼び出し)には3つの関数呼び出ししかありません。内部クラスへの呼び出し、または内部クラスで作成されたメインクラスへの呼び出しをインクルードしますか?あなたは同じクラスの他のメソッドへの呼び出しを含めるか?

ソースに関係なく、どのようなメソッド呼び出しでも見れば、正規表現はおそらく動作しますが、正しくなるのは難しいでしょう(正規表現は内容のようなメソッド呼び出しを含む文字列を適切に無視しますか?コンストラクタの呼び出しを適切に処理しますか?)あなたがメソッド呼び出しのソースを気にするならば、正規表現はおそらくあなたが望むものを手に入れません。リフレクションを使用する必要があります(残念ながら、リフレクションについては十分分かりませんが)。