3 回答
TA贡献1797条经验 获得超6个赞
注释是元元对象,可用于描述其他元对象。元对象是类,字段和方法。向一个对象索要其元对象(例如anObj.getClass()
)称为自省。内省可以走得更远,我们可以问一个元对象其注释是什么(例如aClass.getAnnotations
)。内省和注释属于所谓的反射和元编程。
注释需要以一种或另一种方式解释才有用。注释可以在开发时由IDE或编译器解释,也可以在运行时由框架解释。
注释处理是一种非常强大的机制,可以通过多种不同方式使用:
描述元素的约束或用法:例如
@Deprecated, @Override
或@NotNull
描述元素的“性质”,例如
@Entity, @TestCase, @WebService
描述元素的行为:
@Statefull, @Transaction
描述如何处理元素:
@Column, @XmlElement
在所有情况下,都使用注释来描述元素并阐明其含义。
在JDK5之前,现在需要将使用注释表示的信息存储在其他位置,并且经常使用XML文件。但是使用注释会更方便,因为它们将属于Java代码本身,因此比XML更易于操作。
注释的用法:
文档,例如XDoclet
汇编
集成开发环境
测试框架,例如JUnit
IoC容器,例如Spring
序列化,例如XML
面向方面的编程(AOP),例如Spring AOP
应用程序服务器,例如EJB容器,Web服务
对象关系映射(ORM),例如Hibernate,JPA
还有很多...
...例如看一下Lombok项目,该项目使用批注定义了生成方法equals
或hashCode
方法。
TA贡献1851条经验 获得超3个赞
Java的注释有多种应用程序。首先,它们可能由编译器(或编译器扩展)使用。考虑例如Override注释:
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标准(持久性,依赖项注入,您将其命名)都使用了这种注释处理,以提供必要的元数据和配置信息。
TA贡献1770条经验 获得超3个赞
注释是添加到Java源文件中的元数据(关于数据的数据)的一种形式。框架广泛使用它们来简化客户端代码的集成。我想到了几个真实的例子:
JUnit 4-将
@Test
注释添加到要运行JUnit运行器的每个测试方法中。设置测试也有其他注释(如@Before
和@BeforeClass
)。所有这些都由JUnit运行器处理,JUnit运行器相应地运行测试。您可以说它是XML配置的替代品,但是注释有时更强大(例如,它们可以使用反射),并且它们更接近于它们所引用的代码(@Test
注释就在测试方法之前,因此目的是该方法的含义很明确-也可以用作文档)。另一方面,XML配置可能比注解更复杂,并且可以包含更多的数据。Terracotta-同时使用注释和XML配置文件。例如,
@Root
注释告诉Terracotta运行时已注释的字段是根,并且其内存应在VM实例之间共享。XML配置文件用于配置服务器并告诉它要检测的类。Google Guice-一个示例就是
@Inject
注释,将其应用于构造函数后,Guice运行时将根据定义的注入器为每个参数查找值。该@Inject
注释将是十分困难的使用XML配置文件进行复制,并且它靠近它引用到构造是非常有用的(想象一下,搜索到一个巨大的XML文件中查找你已经设置了所有的依赖注入)。
希望我给您带来了如何在不同框架中使用注释的信息。
添加回答
举报