Java动态代理实例

来源:互联网 发布:信长野望长野业正数据 编辑:程序博客网 时间:2024/05/21 09:52

静态代理:特征是代理类和目标对象的类都是在编译期间确定下来的,不利于程序的扩展。同时,每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理。

最好可以通过一个代理类完成全部的代理功能。

动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。

代理设计模式的原理:
使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。


/** * 静态代理模式 *///接口interface ClothFactory {    void productCloth();}//被代理类class NikeClothFactory implements ClothFactory{    public void productCloth() {        System.out.println("Nike Factory!");    }}//代理类class ProxyFactory implements ClothFactory{    ClothFactory cf;    //创建代理类的对象时,实际传入一个被代理类的对象    public ProxyFactory(ClothFactory cf) {        this.cf = cf;    }    public void productCloth() {        System.out.println("代理类开始执行!");        cf.productCloth();    }}public class TestClothProduct {    public static void main(String[] args) {        NikeClothFactory nike = new NikeClothFactory();  //创建被代理类的对象        ProxyFactory proxy = new ProxyFactory(nike);       //创建代理类的对象        proxy.productCloth();    }}

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 动态代理的使用 */interface Subject {    void action();}//被代理类class RealSubject implements Subject {    public void action() {        System.out.println("我是被代理类!");    }}//class MyInvocationHander implements InvocationHandler{    Object obj;  // 实现了接口的被代理类的对象的声明    //1.给被代理的对象实例化;2.返回一个代理类的对象    public Object blind(Object obj) {        this.obj = obj;        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);    }    //当通过代理类的对象发起对被重写的方法调用时,都会转换为对如下的invoke方法的调用    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        //method方法的返回值是returnVal        Object returnVal = method.invoke(obj, args);        return returnVal;    }}public class TestProxy {    public static void main(String[] args) {        //1.被代理类的对象        RealSubject real = new RealSubject();        //2.创建一个实现了InvocationHandler接口类的对象        MyInvocationHander hander = new MyInvocationHander();        //3.调用blind()方法,动态的返回一个同样实现了real所在类的实现的接口Subject的代理类的对象        Object obj = hander.blind(real);        Subject sub = (Subject)obj; //此时的sub就是代理类的对象        sub.action();  //转到对InvocationHandler接口的实现类的invoke()的调用                        //再举一个例子        NikeClothFactory nike = new NikeClothFactory();        ClothFactory proxyCloth = (ClothFactory) hander.blind(nike); // proxyCloth即为代理类的对象        proxyCloth.productCloth();    }}

原创粉丝点击