包注释有什么意义?

我明白类注释的目的,这要感谢在Java中使用注释的方式和位置? 。 包注释的目的是什么,正如本篇博文和Java语言规范的§7.4.1所描述的那样 ?

为什么要将元数据与包关联? 你可以做什么样的事情?

  1. bnd工具 (和maven-bundle-plugin)使用包注释。 将@Version和@Export注释放在package-info.java中可以生成OSGi元数据。
  2. javadoc使用包注释。
  3. 例如 ,JAXB使用包级别注释来指定将Javatypes映射到程序包范围内的XML Schematypes。 包注释也用在JBoss的xml绑定中。
  4. Struts 2 Convention插件使用一个注解来为包中的所有操作指定一个默认的拦截器。
  5. 有一些包级别的Hibernate注释 。 这些注释的用法的例子可以在这里find。

我认为@Deprecated将是有道理的。 也可能像@Generated如果整个包是由非Java源的某个工具生成的。 或@Internal如果这个包不是公共API的一部分。

也许OSGi工具(你需要声明你的软件包的版本以及你所依赖的软件包)也可以使用这个工具。

有没有人看到野外的人?

我能想到的两个原因是:

  • 注释特殊的包让某些方面(例如使用AspectJ)来编织它们中的类以获得特定的function。
  • 注释某些工具要读取的软件包,例如源代码,元数据或其他types的资源生成。

例如,JAXB允许通常在types上使用的大多数注释同样适用于包。 这种情况下的含义是指定该包中所有类的默认值。

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

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

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

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

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

testing元数据 – 即testing包的元数据(unit testing或其他)。 您可以在程序包级别上创build各种适合的testing元数据,例如:特性,所有者,版本,错误/问题等。可以在类或方法级别对这些元素进行细化,但是可以使用包级别定义或默认值为简洁起见可能会很方便。 我使用了这种方法的一个变种(在注释的好处之前)。

对于通用代码元数据,也可以采用类似的观点:特征,所有权,缺陷,历史信息等等。