java设计模式:动态代理模式

所谓动态代理,即通过代理类: Proxy的代理, 接口和实现类之间可以不直接发生联系,而可以在运行期( Runtime)实现动态关联。I
java动态代理主要是使用java.lang.reflect包中的两个类。

InvocationHandler类
public Object invoke(Object obj,Method method,Object[] obs)
其中第一个参数obj指的是代理类,method是被代理的方法,obs是指被代理的方法的参数组。此方法由代理类来实现。

Proxy类
protected Proxy(InvocationHandler h);
static Class getProxyClass(ClassLoader loader,Class[] interfaces);
static Object newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h);
动态代理其实是在运行时生成class,所以,我们必须提供一组interface,然后告诉他class已经实现了这些interface,而且在生成Proxy的时候,必须给他提供一个handler, 让他来接管实际的工作。

代码示例:
测试主类:

package proxy;

public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        CreateProxy createProxy = new CreateProxy();
        Subject o = (Subject)createProxy.create(person);
        o.shopping();//invoke
    }
}
/**
运行结果:
搭建平台.....
商品选品
付款,买到一大堆零食
完成交易!
*/

Subject 类

package proxy;

public interface Subject {
    public void shopping();
}

Person 类

package proxy;

public class Person implements Subject {
    @Override
    public void shopping() {
        System.out.println("付款,买到一大堆零食");
    }
}

CreateProxy类:

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//用于动态生成代理对象
public class CreateProxy implements InvocationHandler {
    private Object target;//相当于Person对象

    public Object create(Object target){
        this.target=target;
        //创建代理对象,参数为类加载器,对象所在类的接口
        Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        return proxy;
    }
    //代理对象要执行的方法
    //proxy:代理对象
    //method:被代理要执行的方法(即shopping)
    //args:被代理对象的参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("搭建平台.....");
        System.out.println("商品选品");
        //反射获取方法
        method.invoke(target,args);
        System.out.println("完成交易!");
        return null;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章