2017-10-02 2 views
0

Gibt es eine Möglichkeit, zusätzliche Informationen über eine Methode zu erhalten, wenn Sie eine Ausnahme (Stacktrace) bekommen? Ich brauche genau die Anmerkungen. Wie man den Methodennamen und den Klassennamen bekommt, ist verständlich.Get method Anmerkungen von StackTrace

+0

Welche Plattform/Sprache verwenden Sie? Java? –

+0

ja, habe es vergessen, es ist meine erste Frage) – Zhenya

Antwort

1

Wenn Sie einen Stack-Trace erhalten, können Sie immer Informationen über die Klassen, ihre Methoden sowie ihre Anmerkungen erhalten. Sie müssen etwas zusätzlichen Code schreiben, um zu diesen Informationen zu gelangen. Sie müssen die Methode aus dem Stack-Trace-Element abrufen und dann eine Methode mit Reflektion materialisieren und deren Anmerkungen erhalten.

Hier ist ein Beispielcode, der demonstriert, wie Sie die Annotationsinformationen aus einer Stack-Trace abrufen können. Der entsprechende Code ist in Methode printAnnotationsFromStacktrace():

@Ignore 
public class SimpleTests2 { 

    @Ignore 
    @Deprecated 
    public static void main(String[] args) throws ParseException, ClassNotFoundException { 
     System.out.println(numUnique(new double[]{1.0, 1.0, 2.0, 3.0, 4.0, 3.0})); 
    } 

    @SuppressWarnings("test") 
    private static int numUnique(double[] list) throws ClassNotFoundException { 
     int unique = 0; 
     for (int i = 0; i < list.length; i++) { 
      boolean existsBefore = false; 
      for (int j = i - 1; j >= 0; j--) { 
       if (list[i] == list[j]) { 
        existsBefore = true; 
        break; 
       } 
      } 
      if(!existsBefore) { 
       unique++; 
      } 
     } 
     printAnnotationsFromStacktrace(); 
     return unique; 
    } 

    private static void printAnnotationsFromStacktrace() throws ClassNotFoundException { 
     StackTraceElement[] stacktraces = Thread.currentThread().getStackTrace(); 
     for(StackTraceElement stackTraceElement : stacktraces) { 
      Class<?> aClass = Class.forName(stackTraceElement.getClassName()); 
      System.out.println(aClass); 
      printAnnotation("\t%s%n", aClass.getAnnotations()); 
      String methodName = stackTraceElement.getMethodName(); 
      Method[] methods = aClass.getMethods(); 
      for(Method method : methods) { 
       if(method.getName().equals(methodName)) { 
        System.out.printf("\t%s%n", method); 
        printAnnotation("\t\t%s%n", method.getDeclaredAnnotations()); 
       } 
      } 
     } 
    } 

    private static void printAnnotation(String pattern, Annotation[] annotations) { 
     for(Annotation annotation : annotations) { 
      System.out.printf(pattern, annotation); 
     } 
    } 
} 

Wenn Sie diesen Code ausführen, erhalten Sie einen Ausdruck der Klassennamen mit entsprechenden Anmerkungen als auch von dem Stack-Trace-Verfahren zusammen mit seinen Anmerkungen sehen. So etwas wie dieses:

class java.lang.Thread 
    public java.lang.StackTraceElement[] java.lang.Thread.getStackTrace() 
class SimpleTests2 
    @org.junit.Ignore(value="") 
class SimpleTests2 
    @org.junit.Ignore(value="") 
class SimpleTests2 
    @org.junit.Ignore(value="") 
    public static void SimpleTests2.main(java.lang.String[]) throws java.text.ParseException,java.lang.ClassNotFoundException 
     @org.junit.Ignore(value="") 
     @java.lang.Deprecated(forRemoval=false, since="")