Java - 循环遍历堆栈跟踪并获取类和方法实例?

时间:2013-10-14 02:11:30

标签: java annotations stack-trace

我正在尝试遍历堆栈跟踪并检查是否存在任何这些方法上的特定注释。 下面的代码初始化了正确的类,但是当我调用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();
    }
}

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

这样做的缺点是

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
        }
    }    
}