是否保证为AspectJ方面调用静态初始化器?

时间:2010-02-09 09:42:10

标签: java classloader aspectj

这是我的第一个问题所以请保持温柔。 :-)我知道AspectJ可以在java 的静态初始化器上创建切入点。但问题是,如下所示,静态初始值设定项方面是否可以保证只调用一次:

@Aspect
public class MyAspect {
  private static Map configuration;
  static {
    // Some initialization stuff
    configuration = Config.getConfiguration();
  }
  ... use the "configuration" map in pointcuts and advices
}

换句话说,是否加载了像java类一样加载的方面?这是通过ClassLoader完成的吗?我猜是的 - 它似乎有效 - 但我正在寻找这些方面的保证。

1 个答案:

答案 0 :(得分:1)

AspectJ使用字节码修改。这种修改可以在编译时(“编译时编织”或CTW)或加载时(“加载时编织”或LTW)发生。

如果你想确定,那么我建议你使用aspectj编译器在你的例子上执行CTW,然后通过javap工具(或类似的东西)传递生成的类文件,看看它是什么实际上是生成了。这应该让你放心,它是(或不是)做你认为它做的事情。