es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo hacer que JVM represente el único método de interfaz de proxy?

public interface Acción {
    void hacerAlgo();
    void noProxear();
}

Por ejemplo, con esta interfaz, solo quiero que la JVM cree un proxy para el método hacerAlgo.

class ProxyDinámico implements InvocationHandler{
    private Acción trabajo;
    public ProxyDinámico(Acción acción){
        this.trabajo = acción;
    }
    @Override
    public Object invoke(Object proxy, Method método, Object[] args) throws Throwable {
        System.out.println(método.getName()+" comienza");
        var tmp = método.invoke(trabajo,args);
        System.out.println(método.getName()+" termina");
        return tmp;
    }

Acción acción = (Acción) Proxy.newProxyInstance(handler.getClass().getClassLoader(),trabajo.getClass().getInterfaces(),handler);

El trabajo es una instancia de la clase de implementación de la interfaz Acción. Si utilizo Proxy.newProxyInstance, parece que hace que todos los métodos de la interfaz sean manejados por el handler.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Este fragmento de código demuestra cómo utilizar el proxy dinámico de JDK para interceptar llamadas a métodos en una interfaz.

    La interfaz llamada Action contiene dos métodos – doSomething() y dontProxy(). El objetivo es hacer que el JVM sólo provea el método doSomething().

    Para lograrlo, se crea una clase llamada DynamicProxy que implementa la interfaz InvocationHandler proporcionada por JDK. La clase DynamicProxy tiene un constructor que toma una instancia de una clase que implementa la interfaz Action.

    El método invoke() de la clase DynamicProxy es llamado por el JVM cuando se invoca un método de la interfaz Action. Dentro del método invoke(), el nombre del método invocado se imprime en la consola seguido de ‘start’, después el método real es invocado en la instancia subyacente de Action, y finalmente el nombre del método se imprime nuevamente con ‘end’ anexado.

    Finalmente, una nueva instancia de la interfaz Action es creada utilizando el método Proxy.newProxyInstance(). Este método toma tres argumentos: el cargador de clases de la instancia de DynamicProxy, la lista de interfaces que la instancia proxy debe implementar, y el objeto DynamicProxy en sí mismo.

    De esta manera, cuando uno de los métodos doSomething() es llamado en la nueva instancia de Action, el objeto DynamicProxy intercepta la llamada y registra su inicio y finalización. Sin embargo, cuando el método dontProxy() es llamado, éste es ejecutado en la instancia subyacente de Action sin ser interceptado por el objeto DynamicProxy.

Comments are closed.