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?

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de rodrigo salado anaya

#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 ).

Imagen de ezamudio

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...

Imagen de benek

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ó.