是否可以在Java中创建注释包(即,应用其他注释的注释)?

时间:2020-09-16 12:08:37

标签: java spring annotations aop lombok

假设以下代码在代码库中经常出现:

// old wet code
@AnnotationA
@AnnotationB
@AnnotationC
class SomeClass {
   // ...
}

是否可以创建一个注释AnnotationBundle来应用其他注释(A,B,C)并生成相同的功能?这只会用于使代码库干燥,而不会意外忘记类上的单个注释。

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

2 个答案:

答案 0 :(得分:2)

简短回答

不,您不能。像这样的Java中没有元注释的概念。

替代1:Spring注释

有人提到了Spring元注释。是的,在Spring中您可以做到这一点,但这仅仅是因为Spring实现了一些非常令人印象深刻的内部机制,其中涉及反射和其他机制,以实现这一概念。所以

  • 您使用Spring并依靠它的功能,
  • 或者您重建类似的东西,并确保您自己的应用程序使用您正在构建的框架
  • 或者您提取Spring批注内容并在Spring外部使用。

我前一段时间做手指运动是因为我想看看是否有可能将其提取出来。这很困难,因为它与Spring的其他内容深深地纠缠在一起,但最终我还是做到了。

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

您可以克隆并构建我的GitHub存储库,然后查看它是否可以帮助您完成您想做的事情。但这并不会神奇地发生,您必须调用相应的方法才能收集此类信息。

替代2:AspectJ

作为替代,您可以使用AspectJ(我在说的是真正的AspectJ,而不是Spring AOP)并使用ITD(类型间定义),例如使类实现接口或在类型上声明注释。这样,您可以实现模拟元注释的方面。该方面将处理所有事情,应用程序将不需要了解它。不过,我不确定是否要学习AOP。

答案 1 :(得分:0)

通过伪造元注释(例如Spring MVC - Meta AnnotationsWhat Are Meta-Annotations in Java?)),看来Java在技术上是可行的。

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