动态代理模式

博文:http://www.cnblogs.com/super-d2/archive/2012/07/31/2616135.html 介绍了静态代理模式。

  如果按照这种方法,在实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的膨胀;此外如果事先不知道真实角色的话,按照这种方式,我们将无法使用代理。

但是可以使用动态代理模式去解决这个问题:

  所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替代你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作.

  要明白动态代理,必须明白:InvocationHandler这一个接口,InvocationHandler是一个要被被代理实例的调用处理器实现接口,而每一个代理实例都会有一个与之关联的调用处理器。接口中只定义一个方法:invoke(),所以实现该接口的类,必须实现invoke()这个方法。在使用动态代理类时,我们必须实现InvocationHandler接口;

接口:

public interface Subject {

    public void request();

}

实现类:

public class RealSubject implements Subject{

    public void request() {

        System.out.println("From real Subject");

    }

}

动态代理类:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;



public class DynamicSubject implements InvocationHandler {



    Object sub;

    

    DynamicSubject(Object obj){

        this.sub = obj;

    }

    public Object invoke(Object proxy, Method method, Object[] args)

            throws Throwable {

        System.out.println("before calling:" + method);

        

        method.invoke(sub,args);

        

        System.out.println("after calling:" + method);

        

        return null;

    }



}

客户端调用类:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;



public class Client {

    public static void main(String[] args) {

        RealSubject realsubject = new RealSubject();

        

        InvocationHandler handler = new DynamicSubject(realsubject);

        

        Class<?> classType = handler.getClass();

        

        //下面的代码,一次性生成代理

        Subject subject =(Subject)Proxy.newProxyInstance(classType.getClassLoader(),

                            realsubject.getClass().getInterfaces(), handler );

        

        subject.request();

        

        

        

    }

}

 

你可能感兴趣的:(动态代理)