在AspectJ中添加有关最终方法的建议

时间:2019-05-29 09:21:42

标签: spring-boot aspectj spring-aop final

是否可以使用AspectJ在最终方法周围添加建议?我完全知道使用Spring AOP是不可能的。但是我找不到与AspectJ相关的任何东西。

1 个答案:

答案 0 :(得分:0)

很抱歉,个人介绍性的观点是,但我想这样说:您想使用AspectJ。 您为什么不尝试?,您获得的结果要比在这里写下问题并等待有人回答的结果要快得多。您的问题格式也不适合SO,因为您不会发布任何遇到问题的代码,而只是提出一个一般性问题。

是的,使用AspectJ可以检测最终的类和/或方法:

驱动程序应用程序以及最终方法:

package de.scrum_master.app;

public class Application {
  public final void doSomething() {}

  public static void main(String[] args) {
    new Application().doSomething();
  }
}

方面的原生AspectJ语法:

package de.scrum_master.aspect;

public aspect MyAspect {
  Object around() : execution(* doSomething()) {
    System.out.println(thisJoinPoint);
    return proceed();
  }
}

使用@AspectJ语法的方面:

我确实更喜欢本机语法,但是无论如何,由于某些未知的原因,某些人似乎更喜欢这种丑陋且冗长的版本,带有导入,抛出,显式声明的连接点实例以及更复杂的处理方式:

package de.scrum_master.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class MyAspect {
  @Around("execution(* doSomething())")
  public Object aroundAdvice(ProceedingJoinPoint thisJoinPoint) throws Throwable {
    System.out.println(thisJoinPoint);
    return thisJoinPoint.proceed();
  }
}

控制台日志:

两个方面的效果都相同:

execution(void de.scrum_master.app.Application.doSomething())