JVM何时加载注释类

hhh*_*yyq 5 java jvm annotations classloader

我发现如果我使用注释,程序将不会抛出ClassNotFoundException.

class A {
        @Transactional
        public void insert() {
            //insert something
        }
    }
Run Code Online (Sandbox Code Playgroud)

Tomcat在没有包含该类的javaee-api-7.0.jar的情况下成功启动javax.transaction.Transactional

它让我非常困惑,JVM ClassNotFoundException在加载类时不应该抛出 它A吗?

JB *_*zet 5

不,它不应该.注释只是元数据.即使注释不在类路径中,预计包含注释的字节代码也能正常运行.当然,如果某些库试图实际访问并使用不在类路径中的注释,那将无效.

例如,为了能够明确地支持这一点

  • 添加由FindBugs等字节码静态分析工具使用的注释,在生产中运行代码时没有用
  • 能够在客户端中使用分离的JPA实体,即使服务器是唯一实际使用JPA注释的实体