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

Java运行时保留注释-编译时需要注释类,但运行时不需要?,java,jakarta-ee,annotations,Java,Jakarta Ee,Annotations,我正试图找出使用运行时级别保留注释(例如:@javax.inject.Named)注释的类的编译时和运行时类路径的确切效果。这是我到目前为止的理解: 命名类必须在编译时出现在类路径上 然后将其编译成字节码作为元数据,并可在运行时通过反射API获得,并进行相应处理;但是,此类不需要存在于运行时类路径上 因此,如果我用@javax.inject.Named注释的java类编译一个jar,那么这个编译的jar文件既可以在容器(即Jboss)中运行,也可以在从命令行启动的普通旧JVM中运行(没有额外的类

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

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


    如果是这种情况,我是否需要创建一个包装器对象(用@javax.inject.Named注释)来委托给内部的非注释对象?另一个选项是在编译时禁用注释处理吗?请参见

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


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

    不同之处在于javax.annoation在rt.jar中,因此编译器或运行时类路径始终可用,而我上面的特定注释(javax.named.Inject)不在rt.jar中,据我所知,它不是标准JDK的一部分,我指的是诸如Nonnull、Nullable等注释,它们是JSR305的一部分,不在JDK中。FindBugs注释不在JDK Either中,所以说“不,您需要…”,您真正的意思是“是的,您需要…”,即直接编译该文件时,必须始终在编译时类路径中包含注释?如果您使用了包的导入与完全限定的注释名,即import@javax.inject.Named,这有关系吗;使用@javax.inject.Named class A{…}@GreenieMeanie命名class A{…}vs“否”是对您在问题中的错误假设的反应。我删除了它,因为它确实令人困惑。无论您使用完全限定名还是导入都不会改变任何事情:如果源文件使用类,编译器会检查该类是否存在并在源文件中正确使用(即,注释在应该使用它的地方使用,具有所需的属性等)。好的,因此,当编译的jar与该注释链接时,无论该链接是在运行时还是在编译时,该注释都不需要出现在任何路径上。但是,当直接使用注释编译该类时,编译器显然需要该类。所以考虑到这一点,并考虑到我的需求,这个类有时会被直接重新编译而不是链接,我建议的包装类解决方案可行吗?谢谢