119

Java中注解的目的是什么?我有一个模糊的想法,认为它们介于注释和实际代码之间。它们会在运行时影响程序吗?

它们的典型用途是什么?

它们是 Java 独有的吗?有 C++ 等价物吗?

4

8 回答 8

84

注释主要由检查其他代码的代码使用。它们通常用于在运行时修改(即装饰或包装)现有类以改变它们的行为。JUnitHibernate等框架使用注解来最大限度地减少您自己编写以使用这些框架所需的代码量。

Oracle在其网站上对Java 中的概念及其含义进行了很好的解释。

于 2008-08-23T13:38:25.760 回答
17

此外,它们是 Java 独有的吗,是否有 C++ 等价物?

不,但是 VB 和 C# 具有相同的属性

它们的用途非常多样化。一个典型的 Java 示例@Override对代码没有影响,但如果修饰方法实际上没有覆盖另一个方法,编译器可以使用它来生成警告(或错误)。类似地,方法可以被标记为过时的。

然后是反射。当您在代码中反映类的类型时,您可以访问属性并根据那里找到的信息采取行动。我不知道 Java 中的任何示例,但在 .NET 中,编译器使用它来为类生成(反)序列化信息,确定结构的内存布局并声明从遗留库(以及其他库)导入的函数。它们还控制 IDE 表单设计器的工作方式。

/EDIT:类的属性与标签接口相当(如Java中的Serializable)。但是,.NET 编码指南说不要使用标签接口。此外,它们仅适用于类级别,而不适用于方法级别。

于 2008-08-23T13:31:05.590 回答
13

Anders 给出了很好的总结,这里是一个 JUnit 注解的例子

@Test(expected=IOException.class)
public void flatfileMissing() throws IOException {
    readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat");
}

这里的@Test注解告诉 JUnit 该flatfileMissing方法是一个应该被执行的测试并且预期的结果是一个 throwed IOException。因此,当您运行测试时,将调用此方法,并且测试将根据是否IOException抛出 an 来通过或失败。

于 2008-08-23T16:16:19.283 回答
7

Java 还具有注释处理工具 (apt),您不仅可以在其中创建注释,还可以决定这些注释如何在源代码上工作。

是一个介绍。

于 2008-08-25T17:02:12.790 回答
4

要查看可以使用注释做的一些很酷的事情,请查看我的 JavaBean 注释和注释处理器

它们非常适合生成代码,在构建过程中添加额外的验证,而且我也一直在将它们用于错误消息框架(尚未发布 - 需要与老板澄清......)。

于 2008-09-16T15:29:27.743 回答
1

通过字面定义,注释向元素添加注释。同样,Java 注释是我们插入到源代码中的标签,用于提供有关代码的更多信息。Java 注释将信息与带注释的程序元素相关联。除了 Java 注释之外,Java 程序还有大量的非正式文档,这些文档通常包含在源代码文件的注释中。但是,Java 注释不同于注释,它们直接使用注释类型对程序元素进行注释,以描述注释的形式。Java 注释以标准和结构化的方式呈现信息,以便处理工具可以轻松地使用它。

于 2013-11-30T07:55:11.127 回答
0

你什么时候使用 Java 的 @Override 注解,为什么? 该链接指的是关于何时应该使用覆盖注释(@override)的问题。这可能有助于更好地理解注释的概念。查看。

于 2014-04-08T10:32:18.663 回答
0

当涉及到 EJB 时,注释被称为选择隐式中间件方法而不是显式中间件方法,当您使用注释时,您正在从 API 中自定义您确切需要的内容,例如您需要为银行转账调用事务方法:不使用注释:代码将是

transfer(Account account1, Account account2, long amount)    
{
   // 1: Call middleware API to perform a security check
   // 2: Call middleware API to start a transaction
   // 3: Call middleware API to load rows from the database
   // 4: Subtract the balance from one account, add to the other
   // 5: Call middleware API to store rows in the database
   // 6: Call middleware API to end the transaction
}

使用 Annotation 时,您的代码不包含使用中间件服务的繁琐 API 调用。代码干净,专注于业务逻辑

transfer(Account account1, Account account2, long amount) 
{
   // 1: Subtract the balance from one account, add to the other
}
于 2016-01-21T15:21:25.460 回答