是否可以用java创建注释包(即应用其他注释的注释)?

是否可以用java创建注释包(即应用其他注释的注释)?,java,spring,annotations,aop,lombok,Java,Spring,Annotations,Aop,Lombok,假设在代码库中经常看到以下代码: // old wet code @AnnotationA @AnnotationB @AnnotationC class SomeClass { // ... } 是否可以创建一个注释AnnotationBundle,以应用其他注释(A、B、C)并生成相同的功能?这将只用于干燥代码库,并且不会意外地忘记类上的单个注释 // new DRY code @AnnotationBundle class SomeClass { // ... } 在Jav

假设在代码库中经常看到以下代码:

// old wet code
@AnnotationA
@AnnotationB
@AnnotationC
class SomeClass {
   // ...
}
是否可以创建一个注释
AnnotationBundle
,以应用其他注释(A、B、C)并生成相同的功能?这将只用于干燥代码库,并且不会意外地忘记类上的单个注释

// new DRY code
@AnnotationBundle
class SomeClass {
   // ...
}

在Java中,通过伪造元注释(例如,)看起来这在技术上是可能的

但并非所有注释都是如此——例如,lombok还不允许这样做,并将注释限制为类类型(而不是
@interface
)。

简短回答 不,你不能。Java中没有元注释的概念

备选方案1:Spring注释 有人提到了Spring元注释。是的,在Spring中您可以这样做,但这仅仅是因为Spring实现了一些非常令人印象深刻的内部机制,包括反射和其他机制,以便实现这个概念。所以

  • 要么使用Spring并依赖其功能
  • 或者重建类似的东西,并确保您自己的应用程序使用您正在构建的框架
  • 或者提取Spring注释内容并在Spring之外使用它
不久前,我做了后者作为手指练习,因为我想看看是否有可能提取它。这是相当困难的,因为它与其他弹簧材料纠缠得很深,但最终我还是做到了

结果是,一个独立版本的Spring注释实用程序,可在Spring之外使用。如果您阅读自述文件,您可以了解我是如何做到这一点的,因为我将其作为模板记录下来,以便将来进行类似的提取。实际上,我从未使用过自己的独立Spring注释实用程序,但我邀请您这样做。Spring可以用注释做更多的事情,例如,检查类实现的接口上是否有注释,超类方法上是否有注释等。这非常强大,并解释了为什么Spring可以实现一些基于注释的东西,这些东西在JRE开箱即用的情况下是不可能实现的。例如,JDK没有继承注释的概念,除了(可选地)从超类继承到子类,而不是从接口继承到类,也不是从方法继承到重写方法

您只需克隆并构建我的GitHub存储库,看看它是否能帮助您完成您想做的事情。但是它本身不会神奇地发生,你必须调用相应的方法来收集这样的信息

备选案文2:AspectJ
作为替代方案,您可以使用AspectJ(我说的是真正的AspectJ,而不是Spring AOP)和ITD(类型间定义),例如,使类实现接口或声明类型上的注释。通过这种方式,您可以实现一个方面来模拟元注释。aspect会处理所有事情,应用程序不需要了解它。不过,我不确定您是否想学习AOP来实现这一点。

这将有助于结合lombok和Spring注释,例如
RequiredArgsConstructor
+
Slf4j
+
服务
谢谢您的回答!我知道一些AOP,但我假设注释会在运行时工作,但在开发期间不会显示生成的方法等(例如,lombok插件不会通过IntelliJ中的AspectJ检测注释)。