2011-01-17 6 views
5

이번에 나는 던져진 예외에서 주석을 얻고 싶습니다. 내 예제 코드는 다음과 같다 :Java에서 예외 메소드를 검색하여 주석을 얻는 방법은 무엇입니까?

public class P { 

    @MyAnnotation(stringValue = "FirstType", intValue = 999) 
    public void test() throws Exception { 
     // ... 
     throw new NullPointerException(); 
    } 

    @MyAnnotation(stringValue = "SecondType", intValue = 111) 
    public void test(int a) throws Exception { 
     // ... 
     throw new NullPointerException(); 
    } 
} 

위의 클래스는이 방법을 포함하고 둘 다 NullPointerException이 던져.

이제 callerElement를 사용하여 예외를 검색하고 예외를 일으키는 패키지 이름, 클래스 이름 및 행 번호를 알 수 있습니다. 여기 내 코드입니다 : 내 콘솔 창에서

public class CallP { 
    public static void main(String[] argv){ 
     P class_p = new P(); 

     StackTraceElement[] callerElement = null; 
     try{ 
      class_p.test(); 
     }catch(Exception e){ 
      callerElement = e.getStackTrace(); 
      System.out.println(callerElement[0].toString()); 
     } 
    } 
} 

, 나는 메시지

StackoverflowQuestion.P.test (P.java:9)

내 질문 입니다 볼 수 있습니다 1. catch 절에서 어노테이션을 얻는 방법은 무엇입니까? 2. 메소드 오버로딩 (P 클래스에서 두 가지 메소드, test)이있을 때, 주석을 얻는 방법은 무엇입니까?

그건 제 질문입니다. 독서에 시간을내어 주셔서 감사합니다.

답변

3

getClassNamegetMethodName()을 사용하여 클래스 및 메소드 이름을 가져온 다음 리플렉션을 사용하여 주석을 가져올 수 있습니다.

힌트 :Class.forName(...) 다음, klass.getMethod(...) 또는 getDeclaredMethod(...) 또는 기타 변형, 다음 method.getAnnotations() 또는 기타 변형. IMO, getMethod(String name, Class<?>... parameterTypes)이 필요에 따라 parameterType을 전달하여 원하는 메소드를 얻을 수 있습니다.

참고 : 찾을 수있는 방법은 없습니다. 유일한 차이점은 행 번호입니다. 그리고 우리가 원하는 메소드와 주석을 얻기 위해 그것을 사용할 수 있다면 의심 스럽습니다. 그래서, 내 마음에 오는 유일한 해결책은이 경우에 오버로드를 피하고 테스트 방법을 고유하게 명명하는 것입니다. 물론, 해결 방법이 될 것입니다. 그러나 이름이 거기에서 테스트 될 내용을 설명하기에 충분해야한다고 생각하지 마십시오.

+1

안녕하세요, Adeel Ansari. callerElement [0] .getMethodName()을 사용하여 메서드 이름을 가져올 수 있습니다. 그러나, 나는 어느 것이 내가 얻고 싶은 것인지 알 수 없다 (나는 두 가지 "시험()"을 가진다). –

+0

@Charles : 예, 맞습니다. 우리가 그것을 찾을 수있는 방법은 없습니다. 유일한 차이점은 행 번호입니다. 그리고 우리가 원하는 메소드와 주석을 얻기 위해 그것을 사용할 수 있다면 의심 스럽습니다. –

관련 문제