搞不懂AJC与javac的工作方式

2022-07-17 00:00:00 aop java aspectj javac compile-time-weaving

我有点搞不懂AspectJ编译器ajc的工作原理。据我所知,在谈到CTW时,AJC用于将方面编织到编译后的字节代码中--即.class文件。

但是,当我查看AspectJ的maven-plugin(aspectj-maven-plugin)时,发现它是在maven的generate-sources阶段运行的,在javac编译器之前。这将意味着编译器在方面编织之后运行。这是有意义的,因为您可以编织ITD、修改类成员等,Java编译器需要知道这些才能编译任何依赖类。

因此,如果是这种情况,并且ajc在javac之前运行,我假设ajc必须首先将所有Java代码编译成字节码才能在任何方面进行编织。

所以问题是,如果ajc已经完成了将所有Java代码编译成字节码的工作,为什么还要运行javac呢?为什么ajc不是唯一需要的编译器?让两个人同时参选难道不是重复了努力吗?另外,javac如何处理ajc已经编译的类?它是否只是忽略它们,因为自生成.class文件以来,源文件中没有任何更改?


解决方案

ajc可以编译所有类,它构建在eclipse Java编译器上。AJC是生成类所需的唯一编译器。

就重复的工作而言,javac很可能不会覆盖时间戳比源Java文件更新的.class文件。您还可以想象构建时,一些源代码是用AJC编译的,而另一些则是用javac编译的。

至于maven计划,我不知道。

相关文章