2011-09-24 7 views
3
public void foo(){ 
    throw new Exception("foo"); 
} 


public void bar(){ 
    foo(); 
} 
bar() foo()bar() 안에 try catch없이 호출되었음을 알기 위해 bar() 메소드를 검사 할 수 있습니까?

리플렉션을 사용하여 메소드를 검사하는 방법

+0

캐치되지 않은 검사 예외로 인해 컴파일에 실패합니다. RuntimeException이라면 더 흥미로울 것이다. 정적 코드 분석에는 몇 가지 해답이있을 수 있습니다. – TJR

답변

7

당신은 프록시 내부의 전체 클래스를 포장에 관심이있을와의 InvocationHandler로 볼 수 있습니다 :

http://www.javalobby.org/java/forums/t18631.html

는 "foo는"이 immediatly 후라는 것을 본다면 특별한 일을 할 것입니다 귀하의 InvocationHandler " 바 "라고 생각합니다.

+0

+1 매우 흥미로운 – JohnJohnGa

+0

+1 - 내 지식을 향상시키는 데 유용한 링크입니다. 감사. 그러나 호출 된 메소드가 try..catch 또는 다른 것을 사용했다는 것을 보여줄 수는 없습니다. – Naved

+0

@Vicente Plata는 프록시를 사용하여 어디서나 try catch를 추가해야한다는 뜻입니까? 왜냐하면 메서드가 이미 try catch를 포함하고 있기 때문에 필요하지 않습니다 ... – JohnJohnGa

0

내 지식이 걱정되는 한, 내부 구현을 볼 수있는 리플렉션 API는 없습니다. Class에있는 메서드 만 검사 할 수 있지만 메서드에 논리를 쓸 수는 없습니다.

0

또한 측면을 사용하거나 mockito 또는 유사한 프레임 워크의 테스트보기에서이 작업을 수행해야 할 수도 있습니다.

이 작업을 수행해야하는 상황을 알지 못하면 최상의 솔루션이 무엇인지 말할 수 없습니다.

3

응용 프로그램 코드에서 메서드 구현을 검사하고 해당 메서드가 내부적으로 try-catch을 사용하지 못하는 경우 조건 분기와 같은 것으로 보입니다.

당신이 단위 테스트를 작성하지 않는 한, 내가 두 가지 이유로이 일을 낙담하자

1. 개발자가 자신의 애플리케이션 로직을 이해해야합니다.

코드가하는 일을 이미 알고 있어야합니다. 이 메서드가 닫힌 소스 API 의 일부인 경우 throw 된 예외 형식에 대한 설명서를 확인하십시오.

2. 불필요한 복잡성이 추가됩니다.

실행의 흐름이 메소드 구현에 의존하기 때문에, 당신은 그 동작이 자신의 소스의 상태에 달려있는 응용 프로그램 있을 것이다. (예. 디버깅을 더 어렵게 만드는, side-effects을 만들 수있는 방법을 변경.)

소스 코드 나 API 문서를 확인하여 방법 동작을 확인할 수있는 경우, 실행시 검증의 필요성은 무엇인가 ?

관련 문제