AspectJ如何运作?

时间:2017-02-01 08:11:52

标签: java aspectj

我想了解Aspect的工作原理。我来自C / C ++背景,魔术永远不会发生。

我知道您可以使用@Aspect注释某些函数,然后记下Aspect实现,依此类推。但是,新代码是如何(以及在​​什么时间)生成的?

假设我没有编辑。我使用javacc命令编译java类 这将生成.class个文件。现在,假设使用Aspect注释java文件。我不应该再用Aspect以某种方式再次编译.class文件来生成另一组.class文件吗?

如果我的理解是正确的,那么这个双重编译步骤是如何在maven中完成的?还是春天?我找到了很多教程,它会告诉你在这里和那里添加什么来使事情有效但没有教程解释这些东西是如何实际工作的。

1 个答案:

答案 0 :(得分:9)

是的,很容易说你是C ++人。没有javacc这样的东西(如果你不是在谈论同名的Java Parser Generator),而是Java编译器叫javac。 ; - )

正如Philipp Wendler已经指出的那样,Eclipse不仅仅是一个IDE,它是一个类似于Apache的组织,而且AspectJ已经被多年前采用作为其项目之一。这也有一个优点,即Eclipse IDE的AJDT(AspectJ开发工具)是您可以为任何IDE获得的最佳AspectJ支持,遗憾的是包括我最喜欢的IntelliJ IDEA,它几乎在所有方面都优于Eclipse IDE,除了它的AspectJ支持相当平庸。

对于次要主题来说太多了。至于你的主要问题,它并不适合StackOverflow,因为它是一个论坛问题,而不是一个需要解决方案的具体编程问题。无论如何,我喜欢AspectJ并会简单回答:

AspectJ有自己的编译器ajc,它基本上是Eclipse Java编译器ejc的增强版本,即它可以用于编译普通的Java文件以及本机AspectJ语法中的方面或者@AspectJ样式基于注释的语法。无论你以哪种方式编织你的方面,例如

  1. 从头开始构建方面+ Java代码ajc(编译时编织),
  2. 仅使用ajc构建方面,使用javacejc或任何其他Java编译器构建Java代码,然后

    1. 通过ajc(编译后或二进制编织)或
    2. 将方面编织到Java类文件中
    3. 在类加载期间使用名为AspectJ Weaver的Java代理(加载时织入,LTW)在运行时将方法编织到Java类文件中,
  3. AspectJ所做的几乎总是一样的:它通过将方面代码编织到其中来修改Java字节代码。在案例1中,您只需直接从ajc获取一组类文件。案例2.1创建了其他新类文件。案例2.2只是直接在JVM中在内存中创建新的字节代码。

    我希望这会有所帮助。我们不要讨论这个问题,好吗?如果您有后续问题,请将我们限制在最低限度,好吗?