2008-10-17 2 views
3

가능하다면 실행 중에 메서드 내에서 실행되는 메서드 호출을 반영하는 방법을 알고 싶습니다. 특히 외부 메소드 호출 (다른 클래스의 메소드)이나 getDatabaseConnection()과 같은 특정 메소드 호출에 관심이 있습니다.Java에서 메서드 동작 반영

내 의도는 메서드 내에서 미리 정의 된 개체의 동작을 모니터링하고 특정 값과 함께 특정 메서드가 호출되는 것처럼 특정 조건이 충족되는 경우 추가 코드를 실행하는 것입니다. 모니터는 완전히 외부 클래스이거나 반사가 아닌 다른 방법으로 모니터 할 오브젝트에 직접 액세스 할 수없는 클래스 세트입니다.

답변

1

나는 BCEL이이를 수행 할 것으로 기대합니다. 웹 사이트에서 :

바이트 코드 엔지니어링 라이브러리

사용자에게 분석 만들고, 조작 (바이너리) 자바 클래스 파일 할 수있는 편리한 가능성을 제공하기위한 이 (을 .class로 끝나는 것).

"분석"부분이 여기 중요한 비트입니다. JavaDoc은 웹 사이트에서 볼 수없는 한 (내가 볼 수있는 한) 보이지 않으므로 도움이 될지 여부는 쉽게 알 수 없지만 합리적인 출발점입니다. 아마 당신은 또한 (Eclipse tooling로) AspectJ 살펴 봐야 있도록

1
BCEL가이 기능을 제공해야

,하지만 ...

을 ... 당신의 요구 사항은 가로 지향 프로그래밍 (AOP)와 같은 많은 소리.

AspectJ의 주요 이점은 특정 조건을 표현할 수있는 잘 설계된 방법을 제공한다는 것입니다.

2

Aspect J이 문제를 해결할 것입니다.

이 같은 포인트 컷을 정의하려고 :

pointcut profilling(): execution(public * *(..)) && (
      within(com.myPackage..*) || 

이 방법으로 당신이 패키지 com.myPackage 내 공공 방법에 대한 모든 호출을 잡을 것입니다. 필요한만큼의 절을 추가하십시오. 당신은 AspectJ를이 guide에 따라 대한 자세한 뭔가를 배우고 싶다면

Object around(): profilling() { 

    //Do wherever you need before method call 
    proceed(); 
    //Do wherever you need after method call 

} 

:

는 다음 코드를 추가합니다.