【问题标题】:How does AspectJ work?AspectJ 是如何工作的?
【发布时间】:2017-06-17 21:44:48
【问题描述】:

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

我知道你可以用@Aspect注释一些函数然后写下Aspect实现等等。但是,新代码是如何(以及在​​什么时间)生成的?

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

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

【问题讨论】:

标签: java aop aspectj


【解决方案1】:

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

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

小话题就这么多。现在至于您的主要问题,它并不真正适合 Stack Overflow,因为它是一个论坛问题,而不是关于需要解决方案的具体编程问题。无论如何,我喜欢 AspectJ,并会简要回答:

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

  1. 使用ajc 从头开始​​构建方面 + Java 代码(编译时编织),

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

  3. 通过ajc(编译后或二进制编织)或

    将方面编织到Java类文件中
  4. 在类加载期间使用称为 AspectJ Weaver(加载时编织,LTW)的 Java 代理在运行时将方面编织到 Java 类文件中,

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

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多