@ afterpectJ语句为"after():staticinitialization(*)"

Seb*_*ian 2 java aspectj aspects static-initialization

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

从我们的一些例子中我可以找到这个代码来初始化记录器:

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

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

这可能吗?

谢谢,

ale*_*hro 7

@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());
}
}
Run Code Online (Sandbox Code Playgroud)

  • @KomodoDave,我只是想知道:为什么你说注释是 AspectJ 5 及以上版本的首选表示法?我发现*定义*方面的注释语法(如上面所使用的)更加困难,因为注释属性中的字符串表达式直到运行时才被解析。将本机 AspectJ 语法与 ajc 一起使用不太冗长,并且它是编译时检查的,这显然比运行时“早得多”捕获了东西。现在,我*确实*认为在定义切入点时使用注释很好,因为开发人员可以将注释视为某些内容的视觉指示。 (2认同)