Java运行时保留注释 - 在编译时需要注释类,但在运行时不需要注释类?

时间:2015-04-01 17:12:34

标签: java java-ee annotations

我试图弄清楚使用运行时级别保留注释注释的类的编译时间和运行时类路径的确切效果,例如:@ javax.inject.Named。这是我到目前为止的理解:

  1. javax.inject.Named类必须在类路径的编译时出现。
  2. 然后将其编译为字节码作为元数据,并可在运行时通过Reflections API获取并进行相应处理;但是,此类不需要存在于运行时类路径中。
  3. 因此,如果我使用@javax.inject.Named注释的java类编译jar,则可以在容器(即Jboss)和从命令行启动的普通旧JVM中运行此编译的jar文件(没有额外的classpath entires)。但是,如果我将这个源代码提供给一个项目,该项目将与javac一起编译(并且没有额外的类路径),它将不再正确编译?如果这个假设是正确的,那么如果我需要在可能或可能不在容器中运行的项目(即Jboss)之间共享已编译的二进制文件和源文件,这似乎有点限制。

    如果是这种情况,我是否需要创建一个包装对象(使用@ javax.inject.Named注释),该对象委托给内部的非注释对象?是另一个在编译时禁用注释处理的选项吗?见http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javac.html#processing

1 个答案:

答案 0 :(得分:0)

您需要在编译类路径中使用注释来使用注释编译源文件。您不需要在类路径中使用注释来使用编译的类B编译类A.

例如,许多开源库(例如Guava或DbSetup)使用javax.annotation或Findbugs注释,但您不需要在类路径中使用这些注释来编译(并运行)您自己的注释源代码依赖于这些库。