Ha JAXB usare strumentazione bytecode?
-
22-09-2019 - |
Domanda
Qualcuno dove lavoro notato (in stacktrace), che durante l'esecuzione della JVM con -javaagent: instrumentation.jar-spring miei JAXB annotato le classi hanno strani nuovi metodi in loro che non abbiamo scritto: per esempio SomeJaxbAnnotatedClass $ JaxbAccessorM_getFields_setFields_java_util_Set.get
Questo significa che JAXB utilizza bytecode strumentazione quando è disponibile? Dove posso saperne di più su questa funzionalità?
Grazie, Yuval
Soluzione
Proprio un'aggiunta al post di skaffman:
Quello che si vede (SomeJaxbAnnotatedClass $ JaxbAccessor ...) è una classe interna, che viene generata dinamicamente dal implementazione di riferimento JAXB. Per evitare sovraccarico riflessione in fase di esecuzione, bytecode per le implementazioni concrete della com.sun.xml.bind.v2.runtime.reflect.Accessor
classe sono generati e iniettato nel caricamento classe corrente richiamando ClassLoader.defineClass (String, byte [], int, int), dopo la riflessione di aggirare il modificatore di accesso protetto del metodo defineClass.
Quindi, l'implementazione di riferimento JAXB non è strumentazione bytecode nel senso che è modificare classi esistenti, ma genera nuove classi di prestazioni runtime ottimizzate.
Altri suggerimenti
Quando il JaxbContext
si avvia, esegue una grande quantità di operazioni di riflessione, di pre-cache tutte le cose sarà poi bisogno. Questo viene fatto per motivi di prestazioni. Non sono sicuro di quello che fa esattamente, ma mi sarei aspettato di svolgere un qualche tipo di logica di generazione di classe runtime, dal momento che sarà più veloce in fase di esecuzione di riflessione prima.
È interessante notare, è possibile disattivare questo comportamento impostando una proprietà di sistema documentato non, che migliora l'avvio del contesto, a scapito delle prestazioni di runtime.
modifica Vorrei sottolineare che questo è ciò che l'implementazione di riferimento Sun JAXB fa sotto le coperte, non è parte della specifica JAXB. Altre implementazioni sono liberi di fare quello che preferiscono.
Ultimo ho controllato, JAXB utilizza la riflessione per generare classi sulla base del XML che fornisci (anche se non l'ho usato in un certo tempo, in modo che possono avere cambiato la loro metodologia).
So che JiBX , d'altra parte, usi BCEL per eseguire la strumentazione bytecode. Ecco un articolo su questo: http://www.ibm.com/ developerWorks / java / library / j-cwt09065 / .
Come già detto da skaffman è possibile disattivare la generazione di tutte quelle classi interne impostando la proprietà di sistema: com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot = true
Naturalmente non è documentato, ma non è cambiato per anni.