0

スタック トレースをループして、これらのメソッドのいずれかに特定の注釈が存在するかどうかを確認しようとしています。次のコードは正しいクラスを初期化しましたが、getMethodName を呼び出すと NoSuchMethodException が発生します。なぜこの例外がスローされているのか分かりますか?

StackTraceElement[] stackTraceElements = Thread.currentThread()
            .getStackTrace();

for (StackTraceElement element : stackTraceElements) {

    try {   
        Class<?> clazz = Class.forName(element.getClassName());
        Method method = element.getClass().getDeclaredMethod(element.getMethodName());
        cache = method.getAnnotation(Cache.class);
        break;
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}
4

2 に答える 2

2

getMethodorを呼び出しgetDeclaredMethodて結果を返すには、一致するパラメーターの型が必要です。getMethodsまたはとを使用getDeclaredMethodsして、メソッド名の比較を行うことができます。

これの欠点は、

public void a()

public void a(int i)

method を探している場合、両方とも一致しますa

public void dumpTrace(){
    StackTraceElement[] stackTraceElements = Thread.currentThread()
        .getStackTrace();

    for (StackTraceElement element : stackTraceElements) {

        try {
            Class<?> clazz = Class.forName(element.getClassName());
            System.out.println("Looking for " + element.getMethodName() + " in class " + clazz);
            for (Method method : clazz.getMethods()){
                if(method.getName().equals(element.getMethodName())){
                    System.out.println("Possible match : " + method);
                }
            }
            for (Method method : clazz.getDeclaredMethods()){
                if(method.getName().equals(element.getMethodName())){
                    System.out.println("Possible match : " + method);
                }
            }
        } catch (Exception e) {
            //  oops do something here
        }
    }    
}
于 2013-10-14T20:37:26.530 に答える