AspectJ切面为何打印调用类名而非方法名?栈溢出问题解析
问题解答
1. 为何切面打印调用者信息仅得到类名而非方法名?
joinPoint.getSourceLocation().getWithinType()本身返回的是当前代码所属的类对象,调用getSimpleName()自然只能拿到类名——这个API的设计目标就是获取代码所在的类,而非具体的调用方法。如果要获取触发切面的目标方法名,应该使用joinPoint.getSignature().getName(),这个方法才会返回具体的方法名称。
2. 为何使用Thread.currentThread().getStackTrace()会触发StackOverflowError?
因为AspectJ切面是织入到目标方法逻辑中的,当你在切面里调用getStackTrace()时,这个方法内部会遍历当前线程的调用栈;而遍历栈帧的过程中,又会再次触发切面的拦截逻辑,形成无限递归调用:切面方法→getStackTrace()→遍历栈帧触发切面→切面方法→……循环往复直到栈内存被耗尽,最终抛出StackOverflowError。
要解决这个问题,要么在切面的切点规则里排除对getStackTrace()相关方法的拦截,要么直接使用AspectJ提供的joinPoint相关API获取调用信息,避免手动遍历调用栈。
内容的提问来源于stack exchange,提问作者sadhana gm
相关产品推荐
相关产品推荐

