Consultor tecnológico de desarrollo de proyectos informáticos.
Ingeniero Técnico en Telecomunicaciones
Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación
Somos expertos en Java/J2EE
Fecha de publicación del tutorial: 2007-04-27
Los ejemplos de este tutorial están hechos con el siguiente entorno de desarrollo:
-
Jboss Eclipse IDE.
- JDK 1.5
Para ello, usaremos la clase java.lang.reflect.Proxy que lleva ya con nosotros desde la versión 1.3 de la J2SE.
Sin más, vamos a realizar un ejemplo sencillo, para demostrar todo esto:
EL EJEMPLO
Nos crearemos un proyecto nuevo en nuestro Eclipse, y generaremos primero un Interfaz que denominaremos Manager, que define toda la funcionalidad que preveemos puede tener la lógica de negocio de las clases de nuestra aplicación:
package com.autentia.adictos.proxy;
public interface Manager {
public void save(Object obj);
public void remove(Integer id);
}
Vamos a construir ahora una clase implemente el interfaz:
package com.autentia.adictos.proxy;
public class UserManagerImpl implements Manager {
public void save(Object obj) {
System.out.println("I save user Objects");
}
public void remove(Integer id) {
System.out.println("I remove user objects");
}
}
Vamos ahora a contruir el Manejador o Handler, que será el que será previamente invocado a los métodos de los managers:
package com.autentia.adictos.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ManagerHandler implements InvocationHandler {
Manager realManager = null;
public ManagerHandler(Manager realManager) {
this.realManager = realManager;
}
/* Este es el método callback que será invocado previamente a cada método de los managers. */
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("A Manager is being invoked:"+method.getName());
// Continuamos invocando al Manager real.
return method.invoke(realManager,args);
}
}
Ahora crearemos una Factor�a de Managers, que creará los mismos encapsulados dentro de un Proxy:
package com.autentia.adictos.proxy;
import java.lang.reflect.Proxy;
public class FactoryManager {
public Manager createManager(Class claseManager) {
Manager realManager = null;
try {
// Creamos un objeto de la clase que recibimos.
realManager = (Manager)claseManager.newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
/* Creamos el CallBack Handler y le pasamos el objeto real para ser invocado posteriormente en su método invoke. */
ManagerHandler handler = new ManagerHandler(realManager);
// Creamos el proxy.
Class[] interfacesQueEncapsulo = new Class[] {Manager.class};
return (Manager)Proxy.newProxyInstance(
claseManager.getClassLoader(),
interfacesQueEncapsulo,handler);
}
}
Creamos una clase para probar lo que hemos hecho:
package com.autentia.adictos.proxy;
public class Test {
public static void main(String[] args) {
// Creamos ahora la factoria
FactoryManager factory = new FactoryManager();
// Usamos la factoria para crear un Proxy sobre UserManagerImpl
Manager manager = factory.createManager(UserManagerImpl.class);
Object obj = new Object();
// Invocamos a los métodos:
manager.save(obj);
manager.remove(1);
}
}
Mostremos la salida estándar:

throws Throwable {
openTransaction();
Object obj = method.invoke(realManager,args);
closeTransaction();
return obj;
}
Creo que esto habla por sí s�lo.
El único problema es que el hacer que nuestros Managers implementen un interfaz es algo rígido, por eso es mejor usar frameworks que nos proporcionan todo esto de una manera más flexible, como Spring, Acegi, EJB 3.0 etc..., pero creo que es más bonito conocer como se hacen las herramientas o en que se basan antes de usarlas, y no creer que es magia....
A continuación puedes evaluarlo:
Fecha publicación: 2013-04-18-19:09:48
Autor: devoured
Fecha publicación: 2009-06-02-03:32:32
Autor:











