Pergunta

Alguém em que trabalho notou (em Stacktrace) que, ao executar a JVM com -Javaagent: Spring -Instrumentation.Jar My Jaxb Anotated Classes tem novos métodos estranhos que não escrevemos: EG SOWSJAXBANTATATATATATCLASS $ JAXBACCESSOM_GETFIELDS_SETFIELDS_JAVA_ULILTATATATATATATATATATATEME

Isso significa que o JAXB usa instrumentação de bytecode quando está disponível? Onde posso ler mais sobre essa funcionalidade?

Obrigado, Yuval

Foi útil?

Solução

Apenas uma adição à postagem de Skaffman:

O que você vê (algumJaxbannotatedclass $ jaxbaccessor ...) é uma classe interna, que é gerada dinamicamente pela implementação de referência do JAXB. Para evitar a sobrecarga de reflexão em tempo de execução, bytecode para as implementações concretas da classe com.sun.xml.bind.v2.runtime.reflect.Accessor são gerados e injetados no carregador de classe atual, invocando o ClassLoader.DefineClass (String, Byte [], int, int), após o uso da reflexão para contornar o modificador de acesso protegido do método DefinClass.

Portanto, a implementação de referência do JAXB não está instrumentando bytecode, no sentido de que está modificando as classes existentes, mas gera novas classes para o desempenho otimizado do tempo de execução.

Outras dicas

Quando o JaxbContext Inicia, ele executa uma grande quantidade de operações de reflexão, para pré-cache todas as coisas que mais tarde precisarão. Isso é feito por razões de desempenho. Não tenho certeza do que faz exatamente, mas eu esperaria que ele realizasse algum tipo de lógica de geração de classes de tempo de execução, pois isso será mais rápido em tempo de execução do que a reflexão bruta.

Curiosamente, você pode desligar esse comportamento definindo uma propriedade do sistema não documentada, o que melhora a inicialização do contexto, às custas do desempenho do tempo de execução.

editar: Devo enfatizar que é isso que a implementação de referência Sun Jaxb faz sob as capas, não faz parte da especificação JAXB. Outras implementações são livres para fazer o que escolherem.

Por último, verifiquei, o JAXB usa a reflexão para gerar classes com base no XML que você fornece (embora eu não o tenha usado há algum tempo, para que eles tenham mudado sua metodologia).

eu sei que Jibx, por outro lado, usa Bcel para executar a instrumentação de bytecode. Aqui está um artigo sobre isso: http://www.ibm.com/developerworks/java/library/j-cwt09065/.

Como mencionado por Skaffman, você pode desligar a geração de todas essas classes internas, definindo a propriedade do sistema: com.sun.xml.internal.bind.v2.runtime.jaxbContextImpl.fastboot = true

Claro que não está documentado, mas não muda há anos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top