Java-循环堆栈跟踪并获取类和方法实例?
我试图循环遍历堆栈跟踪,并检查这些方法中是否存在特定的注释。 下面的代码初始化了正确的类,但是当我调用getMethodName时,我得到了NoSuchMethodException。知道为什么会抛出这个异常吗Java-循环堆栈跟踪并获取类和方法实例?,java,annotations,stack-trace,Java,Annotations,Stack Trace,我试图循环遍历堆栈跟踪,并检查这些方法中是否存在特定的注释。 下面的代码初始化了正确的类,但是当我调用getMethodName时,我得到了NoSuchMethodException。知道为什么会抛出这个异常吗 StackTraceElement[] stackTraceElements = Thread.currentThread() .getStackTrace(); for (StackTraceElement element : stackTraceElemen
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我最终使用了您的解决方案,并在发现方法重载时引发异常/警告。提交答案,以便我可以接受。谢谢