2017-10-02 11 views
0

例外(スタックトレース)を取得したときにメソッドに関する追加情報を調べる方法はありますか? 注釈が正確に必要です。メソッド名とクラス名を取得する方法は分かりやすいです。StackTraceによるメソッド注釈の取得

+0

使用しているプラ​​ットフォーム/言語はどれですか? Java? –

+0

はい、それについて忘れてしまった、それは私の最初の質問です) – Zhenya

答えて

1

スタックトレースを取得すると、クラス、そのメソッド、およびその注釈に関する情報をいつでも取得できます。あなたはその情報を得るためにいくつかの追加コードを書く必要があります。スタックトレース要素からメソッドを取得し、リフレクションを使用してメソッドを実体化し、その注釈を取得する必要があります。

ここでは、スタックトレースから注釈情報を取得する方法を示すサンプルコードを示します。関連するコードは、メソッド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); 
     } 
    } 
} 

は、あなたがその注釈と一緒に注釈同様のスタックトレース方式を対応するクラス名のプリントアウトが表示されます。このようなもの:

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="") 
関連する問題