style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Javassist, Micro ejemplo...

Este es un ejemplo micro de lo que puede hacer Javassist, aquí se ve mas claro los alcances de esta librería:
http://www.javamexico.org/blogs/ezamudio/modificacion_de_codigo_con_java...
http://www.javamexico.org/blogs/ezamudio/transformacion_de_clases_al_vue...

Este trascrito esta basado por completo de la pagina del proyecto:
http://www.csg.is.titech.ac.jp/~chiba/javassist/

El día de la 1ra reunión informal de la comunidad javamexico.org, se platicaron muchas cosas "muy rudas" :D, y me quede mucho con la idea de esta librería, primero se me ocurrió que podía ser implementada con fines de seguridad algo de criptografía, o usarla para dejar rastro de su estado al pasar por varios servidores, bueno, cosas por el estilo. Luego el fin de semana pasado, me la pase estudiando mas el tema, no encontré mucha información, eso fue una lastima.
Pero recapacite y que mas documentación necesito si puedo estudiar el código fuente... :( (algo que probablemente me lleve muchisisismo tiempo).

Así que divague en los usos, uno que me gusta imaginar es el de código evolutivo, como es esto según yo...
por ejemplo me imagino un conjunto de bolitas programadas, en un ambiente virtual (incluso físico), con muchos obstáculos y recompensas, donde tengan alguna manera de medir su rendimiento, y que hayan géneros de bolitas, por lo menos dos géneros diferentes, si una bolita toca a otra y descubre que es una del mismo genero, que ataque o que corra, pero que en la interacción el que venza se quede con información valiosa de la otra bolita, y en otro caso que mezclen información... etc. etc... cosas que ya se han hecho, loqueras para pronto.

Me es muy chido pensar en que podríamos hablar de código que evolucione a ciertas acciones o situaciones, de una forma diferente, de código que se adapte y con mucho esfuerzo y trabajo creo seria mas divertido esto de las loqueras que, como hacer cajitas y botones... pero bueno.. es solo mi punto de vista de esta librería.

jajajaja pero como la conjetura de Poincaré, fue comprobada y no se an visto los beneficios públicos aun, pero se sabe que es algo importante.

Además que pude ser una buena oportunidad de algo....

package ssist;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

/**
 *
 * @author Rodrigo Salado Anaya <xxxx.xx@xxxxx.com>
 */

public class Main {

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) throws NotFoundException, CannotCompileException, InstantiationException, IllegalAccessException {
        /*Returns the default class pool... checa la documentación.*/
        ClassPool cpool = ClassPool.getDefault();
        /*describe la ruta de la fuente de la clase a modificar.*/
        cpool.insertClassPath("/home/rodrigo/NetBeansProjects/rii/pruebas/ssist/build/classes/");
        /*obtenemos la clase a modificar. cheque que sea el mismo nombre de tu paquete en trabajo.*/
        CtClass ctc = cpool.get("ssist.Saludo");
        /*obtenemos el metodo*/
        CtMethod ctm = ctc.getDeclaredMethod("diHola");
        /*insertamos código*/
        ctm.insertBefore(""
                + "int a = 12;"
                + "int b = 24;"
                + "int r = a + b;"
                + "System.out.println(\"La suma de a + b = \" + r);"
                + "");
        ctm.insertAfter(""
                + "System.out.println(\"FIN...\");"
                + "");
        /* Converts the given class to a java.lang.Class object...*/
        Class cSaludo = ctc.toClass();
        /*instaciamos..*/
        Saludo mSaludo = (Saludo) cSaludo.newInstance();
        /*vemos que nos arroja el resultado..*/
        mSaludo.diHola();
        /**
         * Resultado arrojado:
         *
         * La suma de a + b = 36
         * Hola, javamexico.org
         * FIN...
         */

    }
}

package ssist;

/**
 *
 * @author Rodrigo Salado Anaya <xxxx.xx@xxxxx.com>
 */

public class Saludo {

    public void diHola() {
        System.out.println("Hola, javamexico.org");
    }
}

Comentarios

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 ezamudio

Interesante artículo

Sí recuerdo que discutimos de que si solamente se le podían agregar métodos a una clase, o se podían modificar métodos existentes. Con esto demuestras lo segundo.

Ahora imagínate una anotación que te inventes, por ejemplo @Propiedad y con Javassist puedes procesar las clases que tengan esa anotación, de modo que si tienes por ejemplo:

@Propiedad private int valor;

Le agregues con Javassist los métodos de acceso:

public void setValor(int value) { valor = value; }
public int getValor() { return valor; }

Algo así es lo que hace Tapestry 5 con la transformación de clases (entre otras cosas, como la inyección de dependencias). Todo por medio de Javassist.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">