Olá povo ilustre do GUJ,
Acabei de lançar a versão inicial do meu projetinho de estimação dos últimos anos no sourceforge sob a licença LGPL.
ReJava - http://sourceforge.net/projects/rejava/
Página de download: http://sourceforge.net/project/showfiles.php?group_id=122082&package_id=133253&release_id=430016
Se trata de uma API para manipular arquivos .class do Java e uma interface gráfica que utiliza tal API.
No começo eu só criei a interface para ser uma implementação de referência, para provar que a API funciona. A interface deixa o usuário abrir, por exemplo, um arquivo jar, navegar a uma classe qualquer e mostrar os campos, métodos e o bytecode (com syntax highlighting) nos blocos de código contidos naquela classe, modificar alguma coisa, e salvar o arquivo sem tem quer que recompilar a classe. Para quem não está familiar com os conceitos: ReJava não mostra o código fonte java, e sim o código bytecode (numa forma verbal) gerado pela compilador.
O comando javap que vem junto com o JDK pode também ser utilizado para mostrar o bytecode de uma classe determinada, por exemplo (seu classpath precisa apontar para o rt.jar no lib do JDK ou JRE para isso funcionar):
javap -c -classpath ..\lib\rt.jar java.lang.String
Depois de já ter trabalhado um bom tempo com o projeto fiquei sabendo que já existem vários frameworks para manipulação de bytecode, por exemplo:
BCEL - http://jakarta.apache.org/bcel/
ASM - http://asm.objectweb.org/
Serp - http://serp.sourceforge.net/
Agora não sei se faz sentido tentar competir com esses outros frameworks e talvez a única coisa útil que o projeto traz seja o GUI mesmo. Acho que irei pesquisar se um desses atende as necessidades do ReJava GUI e possivelmente mudar ele para usar, por exemplo, o BCEL.
Para demonstrar o uso e as funcionalidades eu criei um tutorial para criar um programa que imprime “Hello, world” na tela.
http://sourceforge.net/docman/display_doc.php?docid=33936&group_id=122082
Infelizmente está disponível só em inglês no momento. Quando eu tiver um pouco de tempo vou traduzir para português.
Também pretendo colocar um tutorialzinho sobre como criar o mesmo programa “Hello world” programaticamente, utilizando a API do ReJava.
Então, qual é a utilidade de tudo isso?
O API pode ser usado para funcionalidades que requerem comportamento mais dinámico do que é possível com java. Injetar funcionalidades de logging, ou para criar um framework de AOP (http://pt.wikipedia.org/wiki/Programação_orientada_a_aspecto), por exemplo.
A interface gráfica é útil para quem quer aprender mais sobre como java bytecode funciona. (No entanto, se aprender sobre java bytecode é útil ou não é outra questão.)
A interface gráfica eu pessoalmente uso, por exemplo, quando eu tenho uma API mal documentada (no momento o próprio ReJava também se encaixa nessa categoria :|) e eu preciso descobrir alguma coisa sobre a implementação para saber como usar o tal API.
Outro dia eu adicionei um
exception.printStackTrace()
num bloco catch vazio de outra API que eu estava usando para descobrir a causa de um erro que estava acontecendo.
No entanto é importante notar que quande se trata de APIs de outros, você deveria se confirmar o que a licença da tal API permite você fazer e o que não. No caso acima eu modifiquei a API temporariamente para resolver um problema no modo que eu usava a tal API.
Qualquer comentários, sugestões, críticas, etc, são muito bem-vindos.
Eu mesmo criticando, sei que a utilidade do projeto pode bem ser questionada. A qualidade do código varia muito. Os javadocs estão faltando em muitos lugares até no core API. Testes unitarios estão faltando. Maioria desses problemas existem por causa do jeito que o projeto iniciou. Eu estava criando um decompilador para executáveis do Windows (http://en.wikipedia.org/wiki/Portable_Executable) só para ver quão dificil seria. No processo de pesquisar sobre as instruções de assembler eu encontrei um documento descrevendo as instruções de java bytecode (até aquele momento eu nem sabia que tal coisa existia). Assim, depois de terminar o decompilador windows, eu comecei a brincar com a decompilação de arquivos classe. Muito tempo, e muitas linhas de código depois e pensei que talvez o código seria útil para alguma outra pessoa também.
[]s,
Sami
PS.
Por favor, desculpem o post gigantesco :oops: