2016-02-18 16 views
5

, ho scoperto che se uso un'annotazione, il programma non getterà uno ClassNotFoundException.Quando JVM carica la classe di annotazione

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

Tomcat inizia successefully senza il JavaEE-api-7.0.jar che contiene la classe javax.transaction.Transactional

Mi fa molto confuso, non dovrebbe la JVM gettare un ClassNotFoundException quando viene caricato la classe A?

+0

Sei sicuro che Tomcat non definisca la propria annotazione "Transazionale"? – DonyorM

+0

Questa risposta potrebbe essere utile: http://stackoverflow.com/a/23502439/1466267 – SpaceTrucker

+0

@DonyorM Sì, sono sicuro.Quando accetto ottengo l'annotazione per riflessione, genera ClassNotFoundException – hhhyyq

risposta

5

No, non dovrebbe. Le annotazioni sono solo metadati. È previsto che il codice byte contenente annotazioni funzioni correttamente anche se l'annotazione non si trova nel classpath. Ovviamente, se alcune librerie tentano effettivamente di accedere e utilizzare l'annotazione che non si trova nel classpath, ciò non funzionerà.

Questo è esplicitamente supportato in modo da essere in grado, ad esempio

  • aggiungere annotazioni utilizzati per byte-code strumenti di analisi statica come FindBugs, che non sono in alcun uso quando si esegue il codice nella produzione
  • essere in grado di utilizzare entità JPA separate in un client anche se il server è l'unico a utilizzare effettivamente le annotazioni JPA
+0

Grazie per la risposta ben fatta. – hhhyyq

Problemi correlati