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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top