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

标签 java jakarta-ee annotations

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

  1. javax.inject.Named 类必须在编译时存在于类路径中。
  2. 然后将其作为元数据编译到字节码中,并可以在运行时通过 Reflections API 获取并进行相应处理;但是,此类不需要存在于运行时类路径中。

因此,如果我编译一个带有 @javax.inject.Named 注释的 java 类的 jar,则该编译后的 jar 文件既可以在容器(即 Jboss)中运行,也可以在从命令行启动的普通旧 JVM 中运行(没有额外的类路径整体)。但是,如果我将此源代码提供给仅使用 javac (并且没有额外的类路径整体)与其一起编译的项目,它将不再正确编译?如果这个假设是正确的,那么如果我需要在可能或可能不在容器(即 Jboss)中运行的项目之间共享已编译的二进制文件和源文件,这似乎有点限制。

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

最佳答案

您需要注释出现在编译类路径中才能使用注释编译源文件。您不需要在类路径中使用它来使用注释编译类 B 来编译类 A。

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

关于Java运行时保留注释-注释类在编译时需要但在运行时不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29396824/

相关文章:

java - 使用多态性打印字符串出现次数

java - 重新加载由 getResourceAsStream 加载的资源

java - 是否可以在包含 java 1.6 的本地计算机上执行 java 1.7 编译的代码文件

java - 从 XMLGregorianCalendar 到 Date/Calendar 增加了额外的时间/不需要的

ios - 无法让 iOS MapKit Annotation 显示标题和副标题

java - 为什么变量显示0?

java - 如何仅使用注释(无 web.xml)设置 JAX-RS 应用程序?

java - 在 Android Studio 中使用 @NonNull 注解的正确方法

android - SQLite 需要具有唯一约束(Android Room 注释)

Java HashMultiMap 存储问题