`

动态代理

阅读更多

动态代理:

 

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

 

动态代理步骤

 

1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法且得有保存被代理对象实例的变量

    Pubic Object invoke(Class proxy,Method method,Object []args){

                 

                  method.invoke(被代理的对象实例args)   

  }

2.

创建被代理的类以及接口

3.通过Proxy的静态方法

newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 创建一个代理

4.通过代理调用方法

//代理处理器 

/**
 * 该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;
 * 此外,在该类还实现了invoke方法,该方法中的 method.invoke(sub,args);
 * 其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,
 * args为执行被代理对象相应操作所需的参数。
 * 通过动态代理类,我们可以在调用之前或之后执行一些相关操作
 */

public class DynamicSubject implements InvocationHandler
{
    /**

      每个代码实例都具有一个关联的调用处理程序。对代理实例调用方法时,将    对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。

     */

   private Object sub;

    public DynamicSubject()
    {
    }

    public DynamicSubject(Object obj)
    {
        sub = obj;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    {
        System.out.println("before calling " + method);

        method.invoke(sub, args);
        
         if(proxy instanceOf Subject){
              System.out.println("代理对象是Subject类型!");//本条语句可以打印
        }

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

        return null;
	}

}


//被代理对象实现得接口
public interface Subject
{
    abstract public void request();
}

//被代理的对象

public class RealSubject implements Subject
{

    public RealSubject()
    {
    }

    public void request()
    {
        System.out.println("From real subject.");
    }

}


//客户端

public class Client
{
	static public void main(String[] args) throws Throwable
	{

		RealSubject rs = new RealSubject(); // 在这里指定被代理类
		InvocationHandler ds = new DynamicSubject(rs);
		Class<?> cls = rs.getClass();

		// 以下是一次性生成代理  返回一个指定接口的代理类实例

		Subject subject = (Subject) Proxy.newProxyInstance(
				cls.getClassLoader(), cls.getInterfaces(), ds);

		subject.request();
	}
}

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics