0
例外(スタックトレース)を取得したときにメソッドに関する追加情報を調べる方法はありますか? 注釈が正確に必要です。メソッド名とクラス名を取得する方法は分かりやすいです。StackTraceによるメソッド注釈の取得
例外(スタックトレース)を取得したときにメソッドに関する追加情報を調べる方法はありますか? 注釈が正確に必要です。メソッド名とクラス名を取得する方法は分かりやすいです。StackTraceによるメソッド注釈の取得
スタックトレースを取得すると、クラス、そのメソッド、およびその注釈に関する情報をいつでも取得できます。あなたはその情報を得るためにいくつかの追加コードを書く必要があります。スタックトレース要素からメソッドを取得し、リフレクションを使用してメソッドを実体化し、その注釈を取得する必要があります。
ここでは、スタックトレースから注釈情報を取得する方法を示すサンプルコードを示します。関連するコードは、メソッド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="")
使用しているプラットフォーム/言語はどれですか? Java? –
はい、それについて忘れてしまった、それは私の最初の質問です) – Zhenya