Nano ejemplo de Javassist
Complementando esta entrada de Rodrigo y estas otras de Enrique, aquí va mi nano ejemplo para modificar una clase con javassist.
Me estaba preguntando si sería posible modificar el bytecode de una clase, pero además salvarlo para que ya no exista dependencia con la biblioteca durante la ejecución.
A menos que haya leído mal en los ejemplos de Rodrigo y Enrique, se modificaba la clase en Runtime, en este ejemplo se modificará en "build-time" que es como se llama cuando se modificar el .class
Primero vemos que hay en el directorio:
Tenemos tres archivos java y la biblioteca javassist.
Este es el código a modificar:
Son dos clases que no están relacionadas.
Las compilamos y vemos que se genere los .class
Listo. Ahora vemos la clase que los intentará usar:
El compilador dice que los tipos son incompatibles. Es correcto porque
no es una subclase de
Vamos a modificar esto usando javassist. Vamos a hacer que Rectangle sea una subclase de Point.
Este es el código ( que por cierto es el primero del tutorial ) :
Despues de compilar vemos el .class modificado:
Vemos que el .class de Rectangle se modificó. Si intentamos compilar ahora no debería de haber errores:
Sin errores.
Bueno despues de todo no fue tan nano, espero que a alguien le sirva.
p.d. ¿Alguién sabe que implicación hay para re-distribuir una biblioteca liberada con Mozilla Public License?
- OscarRyz's blog
- Inicie sesión o regístrese para enviar comentarios
#Ryz Ya decía yo :P
YA decía yo Oscar que tenia que ver con Ryz, no he encontrado donde estas usando Javassist, pero luego comentas que planes tienes para usarlo en Ryz vale.
Saludos y suerte a todos :D.
:) :) Así es mi buen Rodrigo
:) :) Así es mi buen Rodrigo
El código Ryz de prueba que esta en tu link es el siguiente:
Es decir, se está usando el métdo createNewFile() que como se puede ver en la doc, tira la excepción chequeada: java.io.IOException
Instrumentando con Javassist el mensaje:
unreported exception java.io.IOException; must be caught or declared to be thrown
Será cosa del pasado ( aysi, aysi )
Lo bonito es que es tán facil, como un truco de monedas del mago del WingsFactory; sorprende cuando no se sabe como se hace, pero cuando sabes el truco, está de Dohhhh!!...
La respuesta está en el código ( y es algo bochornosa por cierto ).
Tapestry
Tapestry usa Javassist, aunque es para transformación de clases en tiempo de ejecución, y Howard Lewis Ship creo que ya está harto de las broncas que le ha causado y están buscando la manera de reemplazarlo, incluso implementado por cuenta propia lo que necesitan de javassist...
Re: Tapestry
De hecho comentó iberck por acá que para la versión 5.2 Final javassist ya no exista en Tapestry, y que probablemente sería reemplazado por asm.
Yeap, vi esos posts,
Yeap, vi esos posts, interesantes por cierto. El problema que entiendo que tienen con él es cuando lo usan en runtime. Acá espero que no tenga problemas pues lo estoy usando en buildtime ( no hay dependencias en los .class generados ).
Habrá que leer detenidamente cuales son los problemas que les dió.