2012-05-18 23 views
5

私は、インストルメントされたJavaプログラムによって呼び出されるメソッドの名前を出力することができる、単純なJavaエージェントを書きたいと思っています。Javaメソッドを実装する方法は?

例えば、私は楽器にしたい私のJavaプログラムがある:あなたの助けのための

method sayHello has been called 
Hello ! 
method sayHello has been called 
Hello ! 
method sayHello has been called 
Hello ! 

ありがとう:

public class TestInstr { 

public static void sayHello() { 
    System.out.println("Hello !"); 
} 

public static void main(String args[]) { 
    sayHello(); 
    sayHello(); 
    sayHello(); 
} 

} 

私はこのような何かを表示したいと思います!あなたは

public class TestInstr { 

public static void sayHello() { 
System.out.println("method sayHello has been called"); 
System.out.println("Hello !"); 
} 

public static void main(String args[]) { 
sayHello(); 
sayHello(); 
sayHello(); 
} 
} 

を追加することができます方法で

+0

http://stackoverflow.com/questions/10562769/record-every-method-execution –

答えて

8

Javassistなどの計測ライブラリを使用して、そのようにすることができます。

あなたはJavassistのか、リフレクションを使用してすべてのメソッドにこれを拡張することができ、私は一つの方法はあなたに例を挙げてみましょう:

ClassPool pool = ClassPool.getDefault(); 
CtClass cc = pool.get("TestInstr"); 
CtMethod m = cc.getDeclaredMethod("sayHello"); 
m.insertBefore("{ System.out.println(\"method sayHello has been called\"); }"); 
cc.writeFile(); 

詳細については、このリンクをチェックしてください:http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/tutorial/tutorial2.html#intro

+0

ありがとう!私はjavassistを見ていきます。 – kdelemme

1

あなたは、私は、これはあなたが探しているものであるかどうかわからないんだけど、現在の方法

public String getCurrentMethodName() { 
StackTraceElement stackTraceElements[] = 
     (new Throwable()).getStackTrace(); 
return stackTraceElements[1].toString(); 
} 

を取得するために、これを使用することができます。

4

AspectJはこのようなことができることを覚えているようです。しかし、私はそれについての経験はないので、可能性を探ることはあなた次第です! :D

+0

私はそれを使用していませんが、私が聞いたことから、AspectJを見てみると便利だと私は同意します。 – SJuan76

+1

また、完全な制御が必要な場合は、cglibまたはjavassistを使用します。しかし、Springと "around-advice"の使用を検討してください。 – Xeon

1

私はそれが簡単だとは思いません。

私が考えることができる唯一の選択肢は、クラスローダーを実装し、元のクラスをあなたが作成したスタブで置き換えることです(Hibernate/JPAはレイジーローディングのようなことを行います)。スタブは必要な操作を実行し、元のクラスを呼び出して作業を実行します。それは重い負担を招くことになります(反省的な呼びかけは安価ではありません)。

0

をあなたの必要性は、単にある場合AspectJ(静的)でもSpring AOP(動的)でも、アスペクト指向プログラミングはあなたが必要とするものであり、どちらも強力な機能を提供します。 しかし、実行時間を追跡したり、呼び出し元を追跡したりするなど、もっと多くの楽器を処理したい場合は、いくつかの計測器ライブラリが必要になる場合があります。 お手伝いをしてください。

関連する問題