【问题标题】:What's the point of package annotations?包注释有什么意义?
【发布时间】:2011-01-07 03:38:26
【问题描述】:

感谢How and where are Annotations used in Java?,我了解类注释的目的。如in this blog post§7.4.1 of the Java Language Specification 所述,包注释的目的是什么?

为什么要将元数据与包相关联?你能做什么?

【问题讨论】:

    标签: java annotations


    【解决方案1】:
    1. bnd tool(和 maven-bundle-plugin)使用包注释。将 @Version 和 @Export 注释放在 package-info.java 中允许它生成 OSGi 元数据。
    2. javadoc 使用包注释。
    3. JAXB 使用包级注释for example 来指定Java 类型到包范围内的XML Schema 类型的映射。包注解也用于 JBoss 的 xml 绑定。
    4. Struts 2 Convention 插件使用an annotation 为包中的所有操作指定默认拦截器。
    5. 有一些包级别的Hibernate Annotations。可以在here 找到这些注释的用法示例。

    【讨论】:

    • [1] 处的两个链接都已损坏,[5] 处的第二个链接也是如此
    【解决方案2】:

    我想@Deprecated 是有道理的。如果整个包是由非 Java 源的某个工具生成的,则可能类似于@Generated。或者 @Internal 如果此包不是公共 API 的一部分。

    也许 OSGi 工具(您需要在其中声明包的版本以及所依赖的包)也可以利用这一点。

    有人在野外见过吗?

    【讨论】:

      【解决方案3】:

      我能想到的两个原因:

      • 注释特殊包以让某些方面(例如使用 AspectJ)为特定功能编织其中的类。
      • 注释一些要被某些工具读取的包,例如源、元数据或其他类型的资源生成。

      【讨论】:

      • 你是说注解一个包就等于一次性注解了那个包内的所有类?
      • 不,我的意思是你可以用它来表示应该编织该包中的整个类。
      • 这和我写的有什么不同?
      • @Gili:我理解您的评论意味着这些类在语言级别似乎实际上具有该注释它们自己。我理解 Amir 的评论意味着注释处理器可以看到包上的注释(而不是类本身),然后 决定 基于该注释对该包中的每个类执行一些操作.调用Class.getAnnotations()时的结果非常不同。
      • @Andrzej:你说得对。你的评论进一步解释了我的。
      【解决方案4】:

      例如,JAXB 允许通常用于类型的most annotations 同样很好地应用于包。这种情况下的含义是为该包中的所有类指定默认值。

      例如,如果您希望包中通过 getter/setter 公开的所有类的所有属性都映射到 XML 中,您可以在每个类上指定 @XmlAccessorType(XMLAccessType.PROPERTY)只需在包。

      【讨论】:

        【解决方案5】:

        这不是真正的目的,但我将它们用作一种解决方法,以避免重新编译 package-info.java 文件。

        问题是 javac(和 Ant 任务 <javac>)如果只有文档(它们存在的原因)和 package bla; 语句,则不会为 package-info.java 创建类文件,并且ant 任务会重新编译没有(或较旧的)对应.class 文件的每个文件。

        在那里添加一个虚拟注释(如SuppressWarnings)会产生package-info.class 的效果,因此文件在再次更改之前不会重新编译。

        (Ant 1.8.0 通过创建一个空的 package-info.class 解决了这个问题,即使没有注释,但我在这里使用的是旧的 ant。)

        【讨论】:

          【解决方案6】:

          测试元数据——即围绕测试包(单元测试或其他)的元数据。您可以将适合于包级别的各种测试元数据归于,例如:功能、所有者、版本、错误/问题等。这些可以在类或方法级别进行细化,但具有包级别的定义或默认值为简洁起见可能很方便。我已经使用了这种方法的一种变体(在使用注释之前)。

          对于相同类型的通用代码元数据可以提出类似的论点:特性、所有权、缺陷、历史信息等。

          【讨论】:

            猜你喜欢
            • 2018-06-10
            • 1970-01-01
            • 2014-05-02
            • 2013-08-23
            • 2023-03-06
            • 2015-06-13
            • 2011-11-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多