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 语法中的方面。无论您以何种方式编织您的相位,例如
构建方面 + Java 代码 ajc
从头开始(compile-time 编织),
只用ajc
和Java代码用javac
、ejc
或任何其他Java编译器构建方面,然后
通过 ajc
(post-compile 或二进制编织)或
将方面编织到 Java class 文件中
在 class-loading 期间使用称为 AspectJ Weaver 的 Java 代理在运行时将方面编织到 Java class 文件中(load-time编织, LTW),
AspectJ 所做的总是几乎相同:它通过将方面代码编织到字节代码中来修改 Java 字节代码。在情况 1 中,您直接从 ajc
获得一组 class 个文件。案例 2.1 创建了额外的新 class 文件。案例2.2只是在JVM中直接在内存中创建了新的字节码。
我正在尝试了解 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 语法中的方面。无论您以何种方式编织您的相位,例如
构建方面 + Java 代码
ajc
从头开始(compile-time 编织),只用
ajc
和Java代码用javac
、ejc
或任何其他Java编译器构建方面,然后通过
将方面编织到 Java class 文件中ajc
(post-compile 或二进制编织)或在 class-loading 期间使用称为 AspectJ Weaver 的 Java 代理在运行时将方面编织到 Java class 文件中(load-time编织, LTW),
AspectJ 所做的总是几乎相同:它通过将方面代码编织到字节代码中来修改 Java 字节代码。在情况 1 中,您直接从 ajc
获得一组 class 个文件。案例 2.1 创建了额外的新 class 文件。案例2.2只是在JVM中直接在内存中创建了新的字节码。