Java 注释

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

它们的典型用法是什么?

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

34903 次浏览

另外,它们是否是 Java 所独有的,是否有一个 C + + 等价物?

No, but VB and C# have 属性 which are the same thing.

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

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

/EDIT: 类的属性与标记接口(如 Java 中的 Serializable)相当。然而,。NET 编码准则说不要使用标记接口。而且,它们只能在类级别上工作,而不能在方法级别上工作。

注释主要由检查其他代码的代码使用。它们通常用于在运行时修改(例如装饰或包装)现有类,以更改其行为。像 JUnitHibernate这样的框架使用注释来最小化您自己编写使用这些框架所需的代码量。

Oracle 的站点上有 对这个概念及其在 Java 中的意义作了很好的解释

Anders 给出了一个很好的总结,下面是一个 JUnit 注释的示例

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

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

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

这里 是一个介绍。

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

它们对于生成代码、在构建期间添加额外的验证非常有用,我还一直将它们用于错误消息框架(尚未发布——需要向老板澄清...)。

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

什么时候使用 Java@Override 注释? 为什么? 这个链接引用了一个问题,关于什么时候应该使用覆盖注释(@覆盖) ... ..。 这可能有助于更好地理解注释的概念。

Annotations when it comes to EJB is known as choosing Implicit middle-ware approach over an explicit middle-ware approach , when you use annotation you're customizing what you exactly need from the 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
}

而使用注释时,您的代码不包含使用中间-的繁琐 API 调用 代码是干净的,主要关注业务逻辑

transfer(Account account1, Account account2, long amount)
{
// 1: Subtract the balance from one account, add to the other
}

注释新手对注释的第一个问题是: “什么是注释?”事实证明这个问题没有答案,因为在 所有中存在各种 java 注释的 没有普通行为。换句话说,除了它们都以“@”符号开始这一事实之外,没有什么能把它们绑定到一个抽象的概念群体中。

例如,有@Override 注释,它告诉编译器检查此成员函数是否覆盖父类中的一个。还有@Target 注释,它用于指定用户定义的注释(第三种与其他类型的注释没有任何共同之处的构造)可以附加到哪些类型的对象。这些与另一个 except for starting with an @ symbol没有任何关系。

基本上,一些负责维护 Java 语言定义的委员会看守着向 Java 语言添加新关键字的门户,因此其他开发人员将新关键字称为“注释”,从而绕过了这个问题。这就是为什么通常很难理解什么是注释的原因: 因为没有一个共同的特性将所有的注释链接起来,从而可以将它们放在一个概念组中。换句话说,注释作为一个概念并不存在。

因此,我建议分别研究每种不同类型的注释的行为,不要指望通过理解一种注释来了解其他注释。

Many of the other answers to this question assume the user is asking about user defined annotations specifically, which are one kind of annotation that defines a set of integers or strings or other data, static to the class or method or variable they are attached to, that can be queried at compile time or run time. Sadly, there is no marker that distinguishes this kind of annotation from other kinds like @interface that do different things.