2011-01-17 1 views
5

Diesmal möchte ich die Annotation von der geworfenen Ausnahme erhalten. Mein Beispiel-Code ist wie folgt:Wie bekomme ich eine Annotation durch Abrufen der Ausnahmemethode in 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(); 
    } 
} 

Die obige Klasse enthalten 2 Methoden, und beide Nullpointer werfen.

Jetzt kann ich callerElement verwenden, um die Ausnahme abzurufen und den Paketnamen, den Klassennamen und die Zeilennummer kennen, die die Ausnahme verursachen. Hier ist mein Code:

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

In meinem Konsolenfenster kann ich die Meldung

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

Meine Fragen sind 1. Wie bekomme ich die Annotation in die Fangklausel? 2. Wenn Methode überladen (in Klasse P habe ich zwei Methoden namens Test), wie bekomme ich die Annotation?

Das sind alle meine Fragen. Danke, dass Sie Zeit mit Lesen verbracht haben.

Antwort

3

Sie können getClassName und getMethodName() verwenden, um den Klassen- und Methodennamen zu ermitteln, und dann die Reflektion verwenden, um die Anmerkung abzurufen.

Hinweis:Class.forName(...) dann, klass.getMethod(...) oder getDeclaredMethod(...) oder jede andere Variante, dann method.getAnnotations() oder andere Variante. IMO, getMethod(String name, Class<?>... parameterTypes) Ihrem Bedarf entspricht, können Sie den ParameterType übergeben, um die gewünschte Methode zu erhalten.

Hinweis: Es gibt keine Möglichkeit, dass wir das herausfinden können. Als einziger Unterschied ist die Zeilennummer. Und ich bezweifle, dass wir davon Gebrauch machen können, um die gewünschte Methode und ihre Anmerkungen zu erhalten. Die einzige Lösung, die mir in den Sinn kommt, besteht darin, in diesem Fall eine Überlastung zu vermeiden und die Testmethoden eindeutig zu benennen. Natürlich wäre es ein Workaround, aber denkst du nicht, dass der Name beschreibend genug sein sollte, um zu sagen, was dort getestet wird?

+1

Hallo, Adeel Ansari. Ich kann callerElement [0] .getMethodName() verwenden, um den Methodennamen zu erhalten. Ich kann jedoch nicht wissen, welches das ist, das ich bekommen möchte (ich habe zwei "test()"). –

+0

@Charles: Ja, Sie haben Recht. Das können wir unmöglich herausfinden. Als einziger Unterschied ist die Zeilennummer. Und ich bezweifle, dass wir davon Gebrauch machen können, um die gewünschte Methode und ihre Anmerkungen zu erhalten. –