2016-02-18 8 views
5

Я обнаружил, что если я использую аннотацию, программа не будет бросать ClassNotFoundException.Когда JVM загружает класс аннотации

class A { 
     @Transactional 
     public void insert() { 
      //insert something 
     } 
    } 

Tomcat начинает successefully без JavaEE-Апи-7.0.jar, который содержит класс javax.transaction.Transactional

Это делает меня очень смущен, не виртуальная машина бросить ClassNotFoundException при загрузке класс A?

+0

Вы уверены, что Tomcat не определяет собственную аннотацию Transactional? – DonyorM

+0

Этот ответ может быть вам полезен: http://stackoverflow.com/a/23502439/1466267 – SpaceTrucker

+0

@DonyorM Да, я уверен. Когда я получаю аннотацию отражением, он бросает ClassNotFoundException – hhhyyq

ответ

5

Нет, не следует. Аннотации - это всего лишь метаданные. Ожидается, что байт-код, содержащий аннотации, отлично работает, даже если аннотация не находится в пути к классам. Конечно, если какая-то библиотека пытается фактически получить доступ и использовать аннотацию, которая отсутствует в пути к классам, это не сработает.

Это явно поддерживается для того, чтобы иметь возможность, например

  • добавлять аннотации, используемые байт-кода инструментов статического анализа, как FindBugs, которые ни в коем использования при выполнении кода в производстве
  • чтобы иметь возможность использовать отдельные объекты JPA в клиенте, даже если сервер является единственным, кто фактически использует аннотации JPA.
+0

Спасибо за этот хорошо сделанный ответ. – hhhyyq

Смежные вопросы