Custom Annotations、Pluggable Annotation Processing 和 AOP(Aspect Oriented Programming)之间的根本区别是什么?

What is the fundamental difference between Custom Annotations, Pluggable Annotation Processing and AOP (Aspect Oriented Programming)?

我很难区分所有这些注释工具及其用例。 我的猜测是:

那么,自定义注释和 AOP 在运行时保留策略中是否有意义?注释处理对 Class/Source 保留策略有意义吗? AOP 和自定义注解之间的唯一区别是后者是被动的(你需要接收带注解的对象作为参数才能做某事)?为什么需要像 Checker 这样的框架?

  • 注释只是一种Java句法手段,用于向classes、方法、字段或方法参数添加信息。共有三种保留类型指定注释可用的位置:

    • SOURCE表示注解只存在于源代码中,在编译时被丢弃。
    • CLASS表示注解在class文件中,可用于编译后的字节码处理步骤。这是默认值。
    • RUNTIME表示可以在运行时通过反射读取注解。
  • 注解处理 使您能够从源代码中读取注解(即即使是那些 SOURCE 保留的注解)并使用该信息以便生成更多源代码,稍后可以编译。这是一种预处理步骤,可帮助您自动创建样板代码,而不是手动输入。

  • AOP(Aspect-Oriented Programming)是一个无关的概念,请阅读维基百科等以了解更多信息。它不是要修改您的代码,而是要通过将横切关注点编织到您的主要应用程序逻辑中来修改它的行为。有几种方法可以实现和应用AOP,例如

    • 在运行时通过动态代理和委托,如 Spring AOP 那样或
    • 通过编译时、二进制或加载时编织,AspectJ 支持这三种方式。

顺便说一下,Spring AOP 或 AspectJ 等 AOP 工具可以访问 RUNTIME 注释。这并不意味着您需要使用注释才能将方面应用到您的代码,它们只是标记和识别应用程序逻辑中应该应用方面的连接点的几种方法之一。

此外,AspectJ 编译器还支持注释处理步骤,例如,您可以编写一个注释处理器,在编译前从您的源代码注释中创建新的方面或应用程序classes。

为了更详细地解释所有这些,我需要写一系列文章或一本书,所以请自己从这里开始,通过阅读其他网站或书籍来了解这些概念。