在Java中如何以及在何处使用注释?

2022-08-31 05:48:08

我们可以使用批注的主要领域是什么?该功能是否替代了基于 XML 的配置?


答案 1

注释是元元对象,可用于描述其他元对象。元对象是类、字段和方法。请求对象为其元对象(例如 ) 称为内省。内省可以走得更远,我们可以问一个元对象它的注释是什么(例如)。内省和注释属于所谓的反射元编程anObj.getClass()aClass.getAnnotations

注释需要以某种方式进行解释才能有用。注释可以在开发时由 IDE 或编译器解释,也可以在运行时由框架解释。

注释处理是一种非常强大的机制,可以以许多不同的方式使用:

  • 描述元素的约束或用法:例如,或@Deprecated, @Override@NotNull
  • 描述元素的“性质”,例如@Entity, @TestCase, @WebService
  • 描述元素的行为:@Statefull, @Transaction
  • 描述如何处理元素:@Column, @XmlElement

在所有情况下,注释都用于描述元素并阐明其含义

在 JDK5 之前,现在用注释表示的信息需要存储在其他位置,并且经常使用 XML 文件。但是使用注释更方便,因为它们将属于Java代码本身,因此比XML更容易操作。

注释的用法:

  • 文档,例如 XDoclet
  • 汇编
  • 集成开发环境
  • 测试框架,例如 JUnit
  • IoC 容器,例如弹簧
  • 序列化,例如.XML
  • 面向方面的编程(AOP),例如春季AOP
  • 应用程序服务器,例如 EJB 容器、Web 服务
  • 对象关系映射(ORM),例如Hibernate,JPA
  • 以及更多...

...例如,看看龙目岛项目,它使用注释来定义如何生成或方法。equalshashCode


答案 2

Java的注释有多个应用程序。首先,它们可以由编译器(或编译器扩展)使用。例如,考虑覆盖注释:

class Foo {

    @Override public boolean equals(Object other) {
        return ...;
    }
}

这个实际上是内置于Java JDK中的。如果某个方法用它标记,编译器将发出错误信号,该错误不会重写从基类继承的方法。此注释可能有助于避免常见的错误,即您实际上打算重写某个方法,但未能这样做,因为方法中给出的签名与被覆盖方法的签名不匹配:

class Foo {

    @Override public boolean equals(Foo other) {  // Compiler signals an error for this one
        return ...;
    }
}

从 JDK7 开始,允许在任何类型上使用注释。此功能现在可用于编译器注释,例如NotNull,例如:

public void processSomething(@NotNull String text) {
    ...
}

它允许编译器警告您有关变量和值的不正确/未检查的使用。

另一个更高级的注释应用程序涉及运行时的反射和注释处理。这就是(我认为)当你把注释说成是“基于XML的配置的替代品”时所想到的。例如,这是各种框架和JCP标准(持久性,依赖注入,您命名它)使用的注释处理类型,以便提供必要的元数据和配置信息。


推荐