Java 是否保证为AspectJ方面调用静态初始值设定项?

Java 是否保证为AspectJ方面调用静态初始值设定项?,java,classloader,aspectj,Java,Classloader,Aspectj,这是我的第一个问题,所以请温柔点。:-)我知道AspectJ可以在java类的静态初始化器上创建切入点。但问题是,是否保证在如下方面中的静态初始值设定项只调用一次: @Aspect public class MyAspect { private static Map configuration; static { // Some initialization stuff configuration = Config.getConfiguration(); } ..

这是我的第一个问题,所以请温柔点。:-)我知道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类一样?这是通过类加载器完成的吗?我猜是的——这似乎是可行的——但我正在寻找这方面的保证。

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


如果您想确定,那么我建议您使用aspectj编译器对示例执行CTW,然后通过
javap
工具(或类似工具)传递生成的类文件,以查看它实际生成了什么。这会让你放心,它正在(或没有)做你认为它做的事情。

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


如果您想确定,那么我建议您使用aspectj编译器对示例执行CTW,然后通过
javap
工具(或类似工具)传递生成的类文件,以查看它实际生成了什么。这应该会让您放心,它正在(或没有)做您认为它做的事情。

谢谢-我知道一个方面目前的实现非常类似于一个类。但是我看到的文档煞费苦心地说方面不是类,所以我在寻找一个权威声明,它将始终以这种方式工作,而不仅仅是现在这样。类似于“AspectJ方面与java类具有相同的生命周期”的东西。谢谢——我知道目前方面的实现非常类似于类。但是我看到的文档煞费苦心地说方面不是类,所以我在寻找一个权威声明,它将始终以这种方式工作,而不仅仅是现在这样。类似于“AspectJ方面与java类具有相同的生命周期。”根据AspectJ用户邮件列表上的回复,Ramnivas Laddad(优秀书籍AspectJ In Action的作者)说,方面中的静态初始值设定项与类中的静态初始值设定项一样被调用。根据AspectJ用户邮件列表上的回复,Ramnivas Laddad(优秀书籍AspectJ In Action的作者)说,方面中的静态初始值设定项的调用与类中的调用一样。