Então você está se perguntando: qual a solução?
O que você poderia fazer é anexar dinamicamente algum conjunto de código ao seu aplicativo e reescrevê-lo cuidadosamente para que o código despeje informações adicionais que você pode registrar, ou então você pode despejar o estágio do aplicativo em um arquivo de texto. Java nos dá a facilidade de fazer isso usando o Java Agent. Um fato interessante sobre o Java Agent é que os criadores de perfil de aplicativo estão usando a mesma técnica no back-end para coletar informações de uso de memória, vazamento de memória e tempo de execução de métodos.
Mas o que é o Java Agent? É um tipo especial de classe que, usando a API de instrumentação Java, pode interceptar aplicativos em execução na JVM, modificando seu bytecode. Os Java Agents são extremamente poderosos e também perigosos.
Antes de mergulhar, explicarei como um Java Agent intercepta uma classe usando o exemplo HelloWorld simples.

Conforme mostrado no diagrama abaixo, Classloaders são responsáveis por carregar classes de binários para in-memory. Quando você executa o aplicativo HelloWorld compilado (HelloWorld.class), o agent pode ser visto como uma forma de interceptar o comportamento do carregador de classe no tempo de execução. Você pode pensar como o código de bytes java será reestruturado para que o agente possa adicionar o código relevante nos locais corretos. O fato interessante é que, para programas Java, a estrutura do bytecode é muito próxima ao código-fonte do programa Java original. Portanto, embora não instrumentemos o programa Java em si, usamos uma representação muito próxima dele. Uma coisa a observar é que existem linguagens não Java que compilam em bytecode Java (como Scala, Clojure e Kotlin), o que significa que a estrutura e o formato do bytecode para programas podem ser muito diferentes.
Os Java Agents são baseados na facility, vindos da plataforma Java e o ponto de entrada para isso é um pacote de instrumentos java.lang, que fornece serviços que permitem aos agentes instrumentar programas em execução na JVM. O pacote é bastante simples e autocontido, pois contém algumas classes de exceção, uma classe de dados, a definição da classe e duas interfaces. Destes dois, só precisamos implementar a interface classFileTransformer, se quisermos escrever um Java Agent.
Existem duas maneiras de definir um Agent:
A primeira é um agent estático, o que significa que construímos nosso agent, o empacotamos como um arquivo jar e, quando iniciamos nosso aplicativo Java, passamos um argumento JVM especial chamado javaagent. Em seguida, fornecemos a localização do jar do agente no disco e a JVM faz sua mágica.
<imagem>
Shell
$ java -javaagent:<caminho do arquivo jar do agent> -jar <caminho do arquivo jar empacotado que você deseja interceptar>
A segunda maneira é chamada de agent dinâmico.
Em vez de instrumentar a maneira como você inicia o aplicativo, o que você pode fazer é escrever um pequeno código que pega e se conecta a uma JVM existente e diz a ela para carregar um determinado agente.
Este foi uma dica rápida sobre a funcionalidade e aplicabilidade do Java agent. É um tema bastante extenso e que é melhor esplanado no treinamento Formação Java WEB Completa. Nele, o professor Alex Egídio vai abordar os temas de forma prática aplicando a teoria necessária para o melhor entendimento. Aproveite a promoção de 70% de desconto e comece hoje mesmo a desenvolver ou melhorar suas habilidades em Java. O treinamento mostra conceitos básicos ao avançado da linguagem Java e conta com materiais de apoio e um grupo exclusivo de alunos para tirar as dúvidas. Clicando na imagem abaixo, você pode assistir a vídeos demonstrativos do curso bem como o cronograma.
Nenhum comentário:
Postar um comentário