我想使用 AspectJ 记录我在代码中进行的所有方法调用,除了记录器中的方法调用。
@Aspect
public class Logger
{
// Point Cuts
//-----------
@Pointcut("execution(* org.myDomain.*..*.*(..))")
public void selectAll(){}
@Pointcut("within(Logger) && call(* *(..))")
public void codeWithinAspect(){}
// Advices
//-----------
@Before("selectAll()")
public void adviceThatWorksFine(JoinPoint joinPoint)
{
System.out.print(joinPoint.getSignature().toString());
//Utils.printToConsole(joinPoint.getSignature().toString());
}
@Before("selectAll() && !codeWithinAspect")
public void adviceWithInfiniteLoop(JoinPoint joinPoint)
{
//System.out.print(joinPoint.getSignature().toString());
Utils.printToConsole(joinPoint.getSignature().toString());
}
}
类中的第一个建议工作正常(它将每个方法调用写入控制台),第二个建议在调用 org.myDomain.utils.Utils.printToConsole() 方法时导致无限循环,这是由调用建议建议的。
我发现这是一个常见问题,如链接 http://www.eclipse.org/aspectj/doc/released/faq.php#q:infiniterecursion中所述, 但我不明白如何编写切入点所以一个无限循环不会被创建。
帮助