AspectJ 是如何工作的?

How does AspectJ work?

我正在尝试了解 Aspect 的工作原理。我来自 C/C++ 背景,魔法永远不会发生。

我明白了,你可以用@Aspect注释一些功能,然后写下Aspect实现等等。但是,如何(以及何时)生成新代码?

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

如果我的理解是正确的,这个双编译步​​骤在maven中是如何完成的?或 spring?我发现许多教程会告诉您在这里和那里添加什么以使事情正常进行,但没有教程解释这些事情实际上是如何工作的。

很容易看出您是 C++ 高手。没有 javacc 这样的东西(如果你不是在谈论同名的 Java Parser Generator)但是 Java Compiler 被称为 javac。 ;-)

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

小话题到此为止。现在关于您的主要问题,它并不真正适合 Stack Overflow,因为它更像是一个论坛问题,而不是关于需要解决方案的具体编程问题。反正我喜欢AspectJ,简单回答一下:

AspectJ 有自己的编译器ajc,它基本上是 Eclipse Java 编译器 ejc 的增强版,即它可以用来编译普通的 Java 文件以及原生 AspectJ 语法或 @AspectJ 样式 annotation-based 语法中的方面。无论您以何种方式编织您的相位,例如

  1. 构建方面 + Java 代码 ajc 从头开始​​(compile-time 编织),

  2. 只用ajc和Java代码用javacejc或任何其他Java编译器构建方面,然后

  3. 通过 ajc(post-compile 或二进制编织)或

    将方面编织到 Java class 文件中
  4. 在 class-loading 期间使用称为 AspectJ Weaver 的 Java 代理在运行时将方面编织到 Java class 文件中(load-time编织, LTW),

AspectJ 所做的总是几乎相同:它通过将方面代码编织到字节代码中来修改 Java 字节代码。在情况 1 中,您直接从 ajc 获得一组 class 个文件。案例 2.1 创建了额外的新 class 文件。案例2.2只是在JVM中直接在内存中创建了新的字节码。