From: Hernan L. <her...@de...> - 2004-01-14 14:42:02
|
Siguiendo con las profesias de cosas que no se podian hacer aca tengo el código para hacer algo antes de que una variable de instancia cambie su valor. En este caso tengo un bean, digo bean aunque podria ser cualquier objeto. Cuando alguien cambia el valor de la variable privada de instancia nombre, yo imprimo un saludo. public class Persona { private String nombreString; public String getNombre() { return nombreString; } public void setNombre(String _nombreString) { nombreString = _nombreString; } public static void main(String[] args) { try { String _classNameString = "ar.com.dypsa.test.Persona"; // getting the pool, loader and class ClassPool _classPool = ClassPool.getDefault(); // tomo el default classloader de javaassist Loader _loader = new Loader(_classPool); CtClass _class = _classPool.get(_classNameString); // tomo una referencia javaassist a la clase Persona // getting the methods CtMethod[] _aMethods = _class.getDeclaredMethods(); // busco todos los metodos de la clase for ( int _iIndex = 0 ; _iIndex < _aMethods.length ; _iIndex++ ) { CtMethod _ctMethod = _aMethods[_iIndex]; _ctMethod.instrument(new ExprEditor() { // a cada metodo lo digo que si toca el campo nombre.. public void edit(FieldAccess _fieldAccess) throws CannotCompileException { if ( _fieldAccess.getFieldName().equals("nombre") ) { if ( _fieldAccess.isWriter() ) { // si lo quiere cambiar.... _fieldAccess.replace("{ " + // lo que va a hacer es cambiarlo, pero antes imprime "System.err.println(\"salut!" + "$0.nombre = $1; " + " }"); } } } }); } } // tomo una nueva referencia a la clase dinamicamente cambiada Class _theNewClass = _loader.loadClass(_classNameString); // instancio mi nuevo amiguito Object _converter = _theNewClass.newInstance(); // llamo a setNombre y luego a getNombre Method[] _aNewMethods = _converter.getClass().getMethods(); for ( int _iIndex = 0 ; _iIndex < _aNewMethods.length ; _iIndex++ ) { Method _method = _aNewMethods[_iIndex]; if ( _method.getName().equals("setNombre") ) { _method.invoke(_converter, new Object[] { "nuevo_nombre" }); } } for ( int _iIndex = 0 ; _iIndex < _aNewMethods.length ; _iIndex++ ) { Method _method = _aNewMethods[_iIndex]; if ( _method.getName().equals("getNombre") ) { String _nuevoNombreString = (String ) _method.invoke(_converter, null); // en este punto podemos ver que el nombre si cambio, pero que tambien se imprimio salut! System.err.println("nuevoNombreString: [" + _nuevoNombreString + "]"); } } System.err.println("done"); } catch (Exception _exception) { _exception.printStackTrace(); } } } |