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

Java-循环堆栈跟踪并获取类和方法实例?,java,annotations,stack-trace,Java,Annotations,Stack Trace,我试图循环遍历堆栈跟踪,并检查这些方法中是否存在特定的注释。 下面的代码初始化了正确的类,但是当我调用getMethodName时,我得到了NoSuchMethodException。知道为什么会抛出这个异常吗 StackTraceElement[] stackTraceElements = Thread.currentThread() .getStackTrace(); for (StackTraceElement element : stackTraceElemen

我试图循环遍历堆栈跟踪,并检查这些方法中是否存在特定的注释。 下面的代码初始化了正确的类,但是当我调用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();
    }
}
StackTraceeElement[]StackTraceeElements=Thread.currentThread()
.getStackTrace();
用于(StackTraceElement元素:stackTraceElements){
试试{
Class clazz=Class.forName(element.getClassName());
方法Method=element.getClass().getDeclaredMethod(element.getMethodName());
cache=method.getAnnotation(cache.class);
打破
}
捕获(例外e){
e、 printStackTrace();
}
}

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


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

可能是您正在对StackTraceeElement调用getClass(),该方法返回。。。StackTraceeElement,而不是由stack跟踪元素表示的执行点的类


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

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

这样做的缺点是

public void a()

如果您正在寻找方法
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
        }
    }    
}
public void dumpTrace(){
StackTraceElement[]stackTraceElements=Thread.currentThread()
.getStackTrace();
用于(StackTraceElement元素:stackTraceElements){
试一试{
Class clazz=Class.forName(element.getClassName());
System.out.println(“在类“+clazz”中查找“+element.getMethodName()+”);
for(方法:clazz.getMethods()){
if(method.getName().equals(element.getMethodName())){
System.out.println(“可能匹配:+方法”);
}
}
for(方法:clazz.getDeclaredMethods()){
if(method.getName().equals(element.getMethodName())){
System.out.println(“可能匹配:+方法”);
}
}
}捕获(例外e){
//哦,在这里做点什么
}
}    
}

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

这样做的缺点是

public void a()

如果您正在寻找方法
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
        }
    }    
}
public void dumpTrace(){
StackTraceElement[]stackTraceElements=Thread.currentThread()
.getStackTrace();
用于(StackTraceElement元素:stackTraceElements){
试一试{
Class clazz=Class.forName(element.getClassName());
System.out.println(“在类“+clazz”中查找“+element.getMethodName()+”);
for(方法:clazz.getMethods()){
if(method.getName().equals(element.getMethodName())){
System.out.println(“可能匹配:+方法”);
}
}
for(方法:clazz.getDeclaredMethods()){
if(method.getName().equals(element.getMethodName())){
System.out.println(“可能匹配:+方法”);
}
}
}捕获(例外e){
//哦,在这里做点什么
}
}    
}

调用getDeclaredMethod时,需要为所需方法提供参数的参数类型。您也不会得到任何继承的方法。@BevynQ我不想让我的逻辑知道关于该方法的任何事情,除了它有此注释这一事实。这个注释可以在我的web服务层的任何地方实现,我不能为每个特定情况编写代码。您可以尝试
getMethods()
getDeclaredMethods()
它们返回一个方法列表,然后您可以进行名称比较。但是,无法区分具有相同名称的方法。@BevynQ我最终使用了您的解决方案,并在发现方法重载时引发异常/警告。提交答案,以便我可以接受。感谢调用getDeclaredMethod时,需要为所需方法提供参数的参数类型。您也不会得到任何继承的方法。@BevynQ我不想让我的逻辑知道关于该方法的任何事情,除了它有此注释这一事实。这个注释可以在我的web服务层的任何地方实现,我不能为每个特定情况编写代码。您可以尝试
getMethods()
getDeclaredMethods()
它们返回一个方法列表,然后您可以进行名称比较。但是,无法区分具有相同名称的方法。@BevynQ我最终使用了您的解决方案,并在发现方法重载时引发异常/警告。提交答案,以便我可以接受。谢谢