[Esta tradução incorpora atualizações e correções apontadas pela equipe do projeto nos comentários do texto original.]
A JBoss lançou o Byteman 2.0.0, uma ferramenta open source de manipulação de bytecode Java e licenciada sob a GNU LGPL 2.1. O Byteman é um agente Java que ajuda em testes, mapeamento e monitoramento do código. Permite que os desenvolvedores mudem as operações das aplicações Java, enquanto são carregadas ou durante a execução. O Byteman remove a necessidade de reescrever ou recompilar a aplicação, e pode modificar até mesmo as classes da plataforma Java, como String, Thread e outras.
Estas são as principais novidades na versão 2.0.0:
- Informações de arquivos e de depuração: Regras compiladas do Byteman agora contêm informações de arquivos e de número de linhas. Este é um passo na direção de fornecer suporte completo à depuração. (Estão sendo criadas extensões para IDEs e depuradores, especificamente o Eclipse e o IntelliJ Idea, para fornecer suporte para desenvolvimento e execução com o Byteman, mas ainda não foram concluídas.)
- Importação da BMunit do TestNG: As classes do TestNG agora podem importar os comportamentos do BMUnit usando a anotação @Listener. As versões anteriores obrigavam que as classes de TestNG herdassem de BMNGRunner, o que causava conflitos quando as classes de testes já estendiam outras classes de testes.
- Regra para lançamento de erros. Uma nova regra permite lançar exceções não-checadas na aplicação e no código, em tempo de execução da JVM. (O código injetado pelo Byteman é type-checked e type-safe, portanto o lançamento de exceções não pode quebrar o contrato dos métodos.)
O Byteman usa uma linguagem de script simples, chamada Event Condition Action (ECA) para especificar onde, quando e como os códigos Java podem ser manipulados. A execução do código continua normalmente após a execução do código injetado, mesmo seja lançada uma exceção ou fornecido um retorno antecipadamente. O exemplo a seguir demonstra um script simples:
# script.btm RULE trace main entry CLASS App METHOD main AT ENTRY IF true DO traceln("Entrando no main") ENDRULE
Este script informa que o Byteman deve imprimir "Entrando no main" no início do método App.main(). Para habilitar o Byteman na sua aplicação e especificar o script, adicione o agente Java nos argumentos para a JVM:
-javaagent:<BYTEMAN-DIR>\lib\byteman.jar=script:script.btm
Também é possível adicionar o Byteman em aplicações em execução, através do script bminstall.sh. Para regras mais complexas e para a injeção de código, é possível construir os scripts usando os "Rule Helpers" do Byteman, ou criar uma classe POJO e usá-la como plug-in.
De forma similar ao Byteman, a programação orientada a aspectos (AOP) é capaz de controlar classes e injeção de código. Com o Byteman, no entanto, não há necessidade de se criar classes ou compilar código. Ném é preciso se prever 100% do código que deve ser escrito, pois é possível decidir posteriormente o código que deve ser injetado. O Byteman também é mais fácil de usar e alterar, especialmente para testes e necessidades eventuais de logging.
Para saber mais sobre o Byteman, a JBoss disponibiliza um guia do programador bem detalhado, a documentação oficial, um fórum e também as notas de release, informando todas as novidades da versão 2.0.0. O Byteman pode ser baixado no site da JBoss e o código fonte está disponível no GitHub.