java - 获取aspectJ建议中具体类的名称

标签 java aop aspectj

我尝试使用aspectJ 拦截对实现我的Loggable 接口(interface)的类上的公共(public)方法的调用。 Loggable 是一个标记接口(interface),没有定义任何方法。

我有一个 before 建议,其中我想获取包含正在调用的方法的具体类的名称。通过使用 thisJoinPoint.getTarget() 我可以获得具体的类,但是当我调用 thisJoinPoint.getTarget().getClass.getName() 时,我得到一个 stackoverflow 异常。/p>

我非常确定这是因为我在 Concrete 类上调用公共(public)方法,这会导致我的 before 建议重新触发。

这是我的切入点:

切入点 dave() : target(Loggable) && call (public * *(..) ) ;

如何将其限制为直接在具体类中定义的公共(public)方法,而忽略从 java.lang.Object 继承的那些方法?

最佳答案

虽然 StackOverflow 不是一个基于意见的讨论论坛,但我将用一些具体示例来回答,以便更明确一点:

如果!this(LoggerAspect)适合你,使用它。但要注意:当 call() 时,它不会阻止建议被触发。是间接的,即你的advice调用的一个方法,调用了另一个方法。

选项 1:使用 execution()而不是call()

使用 execution() 时切入点,AspectJ 仅在被调用者执行时触发,即在一个位置,而不是在调用者调用被调用者的许多位置。这更有效,并且在这种情况下对您有用,因为您似乎可以控制被调用的代码。仅当方面编织器/编译器确实有权访问被调用者时,您才应该使用 call() 编织调用者。切入点。

作为副作用,第 3 方库或 JDK 代码的执行不会被 execution() 拦截。无论如何,因为编译器/编织器无法访问它,但有一个异常(exception)是通过 LTW(加载时编织)编织的第 3 方库(但不是 JDK 代码)。

选项 2:adviceexecution()切入点

通过将切入点与 && !adviceexecution() 结合起来当 call() 时,您可以停止触发建议是在执行您任何方面的任何建议时提出的。这也排除了间接调用,并且非常适合单个建议。但是,如果您结合多个方面并希望您的建议在 call() 时仍然有效。是根据另一个方面的建议做出的,您可能想使用另一个选项,例如...

选项 3:within()切入点

通过将切入点与 && !within(LoggerAspect) 结合起来当 call() 时,您可以停止触发建议是根据您的LoggerAspect中的任何建议提出的。来自其他方面的调用仍在记录中。

您想要实现的目标决定了您应该选择哪个选项(或其组合)。没有简单的答案,因为我不知道您的具体情况。

关于java - 获取aspectJ建议中具体类的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38747871/

相关文章:

java - Eclipselink:从 JOIN 查询创建对象

java - 如何将注释值发送到 @Before 方法中?

java - 如何在java中的每个catch block 之前注入(inject)日志语句

java - AspectJ:如何替换现有注释

java - 具有回溯法的数独求解算法

java - 如何获取JSoup中td标签中的Image src?

java - (Java)获取google的前n个结果作为链接

.net - Mono Cecil vs. PostSharp Core vs. Microsoft CCI 实现 AOP 框架

java - Spring @Transactional 作为动态 Jdk 代理和 aspectj 切面应用

java - Spring AOP : pointcut @annotation(MyAnnotation) && call(. .) 未按预期触发