java - "after() : staticinitialization(*)"的@AspectJ 语法

标签 java aspectj aspects static-initialization

我正在尝试使用 pertypewithin 实例化模型来实现跟踪方面。 通过这种方式,我将能够为每个类的每个类型使用一个记录器。

从周围的一些示例中,我们可以找到这段代码来初始化记录器:

public abstract aspect TraceAspect pertypewithin(com.something.*) {
    abstract pointcut traced();
    after() : staticinitialization(*) {
        logger = Logger.getLogger(getWithinTypeName());
    }
    before() : traced() {
        logger.log(...);
    }
    //....
}

不幸的是,我无法将其完全转换为 @AspectJ 语法(这是我无法控制的项目要求),尤其是我需要设置记录器的部分,只执行该代码一次。

这可能吗?

谢谢,

最佳答案

@Aspect("pertypewithin(com.something.*))")
public abstract class TraceAspect {

Logger logger;

@Pointcut
public abstract void traced();

@Pointcut("staticinitialization(*)")
public void staticInit() {
}

@After(value = "staticInit()")
public void initLogger(JoinPoint.StaticPart jps) {
    logger = Logger.getLogger(jps.getSignature().getDeclaringTypeName());
}

@Before(value = "traced()")
public void traceThatOne(JoinPoint.StaticPart jps) {
    logger.log(jps.getSignature().getName());
}
}

关于java - "after() : staticinitialization(*)"的@AspectJ 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7382464/

相关文章:

java - 将 JSR 303 Java Bean Validation 异常转换为自定义异常

java - 将切面转换为原生 AspectJ 表示法

caching - 如何在Groovy和Grails中使用Spring AOP方面,特定的缓存示例

java - 如何创建枚举类型的映射?

java - 在 jFreechart 中获取我的系列的坐标

java - Dr.Java 与 ASCII 显示相关

android - 如何设置 AspectJ 以记录 Android Studio 中的方法调用?

java - 如果在 "sleep"期间发生完整 GC,Thread.sleep 将如何表现?

spring - 使用问题: Spring AOP vs. AspectJ编织

java - Spring AOP - 切入点仅在从 lambda 调用 joinPoint.proceed 时应用于方法