Java注解处理器:用途和应用

3

我在Java EE开发方面相对较新,虽然我知道什么是注解以及如何使用它们,但是当涉及到理解为什么有人需要编写和处理自己的注解时,我很难从中看到全貌。

在什么情况下你甚至需要自定义注解呢?

我相信它们在某种程度上很关键,但出于某种原因,我没有看到它们的有用性。

感谢您给予任何正确方向上的推动!

4个回答

3
有许多用途可以使用自定义注释。您可能认为很难找到创建自定义注释的原因,因为许多已在其他框架中定义。为了基本回答自己的问题,您应该问“如果这些框架不存在,我是否需要创建自己的注释用法?”答案可能是肯定的。以下是一些例子:
- 如果 JAX-RS 不存在,您可能会考虑如何使用注释来表示方法的 REST 操作,例如此处所述的操作。 - 如果 JUnit 没有实现类似本文中描述的测试方法的注释,您可能会考虑做同样的事情。 - 如果 Spring 没有实现验证,那么您可能也会想到一些内容,例如此处所述的内容。 - 如果 Java 本身没有为文档编写注释,则您可能会使用此处描述的自定义注释。
每当您想通过其他框架未涵盖的附加元数据丰富您的类时,都可能考虑创建自己的注释。虽然许多聪明的人涵盖了注释的常见用法,但这并不妨碍您在未来想出自己的用法,因此需要自己的自定义注释和处理。

1

在StackOverflow上有一些相关的讨论,例如这里

简单来说:每当您实现自己的框架时,它以某种方式“粘合”代码,并在构建(或运行)时处理某种“元”信息等等。

一些众所周知的例子包括:依赖注入、对象关系映射、反射、文档等。


0

在我看来,它们是Java中可以使用的最好的东西之一,它们为我节省了大量时间。让我给您举个例子:几天前,我正在编写一个图像处理应用程序。所有过滤器都扩展了一个名为Filter的基类,其中许多过滤器具有属性,例如对比度、亮度等等... 现在每个属性都将具有默认值,范围(最小值和最大值),适合GUI的名称。然后,在我想要GUI通过控件公开的过滤器上有一些属性,其他一些则没有。因此,我创建了@FilterPropertyAnnotation,您可以像这样使用它:

...
@FilterAnnotation(name = "Image contrast", default = 0.0D, min = -100D, max = 100D)
public double getContrast(){
...
}

然后,使用反射,每当用户在GUI中选择一个过滤器时,它会扫描该过滤器子类的方法,查看哪些方法具有注释,并仅为我标记注释的属性显示适当的控件,所有这些都具有正确的默认值和比例。我想不出还有比这更简单或更快的方法了。
对我来说,注释是Java中最好的东西。

0

有很多原因,但它们显然是特定于应用程序的。

例如,我们注释域类以便内部安全框架意识。我们处理自己的注释以进行文档编制。我们有状态机注释,用于构建定向图,既用于配置又用于文档编制。

有些在运行时被询问,有些在文档处理期间被询问,有些在启动时被询问,有些具有多种用途。

框架注释最初是一些自定义内容,然后当它被转化为框架并发布时,它们似乎是“显而易见”和“内置的”,但它们不一定总是打算这样做。


感谢您的回答,@Dave。一个快速的跟进问题:那么可以这样说,注释主要用于其他JAR/依赖项检索有关已注释代码的特定上下文元数据,是安全的吗? - IAmYourFaja
嗯...这就是注解所做的事情,提供特定上下文的元数据,对吧?关键在于它们提供给谁:应用内部、应用服务器、ORM等。 - Dave Newton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接