2012-05-18 5 views
5

자바 프로그램에 의해 호출 된 메소드의 이름을 인쇄 할 수있는 간단한 Java 에이전트를 작성하려고합니다.Java 메소드를 구현하는 방법은 무엇입니까?

예를 들어, 내가 악기로 원하는 내 자바 프로그램은 다음과 같습니다

public class TestInstr { 

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

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

} 

I는 다음과 같이 표시 할 것이다 : 당신의 도움에 대한

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

감사합니다!

+0

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

답변

1

방법에서는

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(); 
} 
} 

당신이 당신이 찾고있는 경우 잘 모르겠어요 현재의 방법

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

를 얻을이 사용할 수 추가 할 수 있습니다.

4

나는 AspectJ이 이런 일을 할 수 있음을 기억하고 있습니다. 나는 그것에 대한 경험이 없기 때문에 가능성을 탐구하는 것은 당신에게 달린 것입니다! : D

+0

필자는 사용하지 않았지만 내가 들었던 것으로부터 AspectJ를 보면 유용 할 것이라는 데 동의한다. – SJuan76

+1

또한 완전한 제어를 원하면 cglib 또는 javassist를 사용하십시오. 그러나 봄과 "around-advice"를 사용하는 것을 고려하십시오 – Xeon

1

나는 그것이 쉽지 않을 것이라고 생각합니다.

내가 생각할 수있는 유일한 방법은 클래스 로더를 구현하고 원래의 클래스를 당신이 만든 스텁으로 대체하는 것이다. (Hibernate/JPA는 게으른 로딩을 위해 그렇게한다.) 스텁은 필요한 작업을 수행 한 다음 원래 클래스를 호출하여 작업을 수행합니다. 그것은 무거운 짐을 의미 할 것입니다 (반사 전화는 싸지 않습니다).

0

가 원하는 단순히 경우 :

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(); 

확인 자세한 내용은이 링크 :

나 하나의 방법에 대한 예를 하나 들어 보자, 당신이와 Javassist 또는 반사를 사용하는 모든 방법이를 확장 할 수 있습니다 메소드 호출을 기록하기 위해 AspectJ (정적) 또는 Spring AOP (동적)에 상관없이 aspect 지향 프로그래밍이 필요하다. 둘 다 강력한 기능을 제공한다. 그러나 실행 시간 추적, 통화 추적 등과 같이 더 많은 인스트루먼트를 수행하려는 경우에 대비하여 일부 인스트루먼트 라이브러리가 필요할 수 있습니다. 도움이 되길 바랍니다.

관련 문제