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();
}
}
}
|