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

3

可能是您在 StackTraceElement 上调用 getClass() ,它返回... StackTraceElement 而不是由堆栈跟踪元素表示的执行点的类。

StackTraceElement 提供了一种 getClassName() 方法,您可以使用该方法。

于 2013-10-14T02:25:54.543 回答
2

调用getMethodorgetDeclaredMethod需要匹配的参数类型才能返回结果。您可以使用getMethodsorgetDeclaredMethods并进行方法名称比较。

这样做的缺点是

public void a()

public void a(int i)

如果您正在寻找方法,两者都会产生匹配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 回答