Java之 动态代理

2021-08-27  本文已影响0人  五月笙

代理

什么是代理?

代理
Proxy

静态代理

public interface Sell {
    void sell();
    void ad();
}

public class Vendor implements Sell {
    public void sell() {
        System.out.println("In sell method");
    }

    public void ad() {
        System,out.println("ad method");
    }
}

public class BusinessAgent implements Sell {
    private Sell vendor;

    public BusinessAgent(Sell vendor){
        this.vendor = vendor;
    }

    public void sell() {
        vendor.sell();
    }

    public void ad() {
        vendor.ad();
    }
}

/**
 * 假设需要对sell 对象进行一些限制
 */
public class BusinessAgent(){ implements Sell {
    private Sell vendor;

    public BusinessAgent(Sell vendor){
        this.vendor = vendor;
    }

    public void sell() {
        if (isCollegeStudent()) {
            vendor.sell();
        }
    }

    public void ad() {
        vendor.ad();
    }
}

静态代理的局限是什么呢?

动态代理

代理类在程序运行时创建的代理方式被成为 动态代理

在执行委托类中的方法之前输出“before”,在执行完毕后输出“after”。我们还是以上面例子中的Vendor类作为委托类,BusinessAgent类作为代理类来进行介绍。

public class BusinessAgent implements Sell {
    private Vendor mVendor;

    public BusinessAgent(Vendor vendor) {
        this.mVendor = vendor;
    }

    public void sell() {
        System.out.println("before");
        mVendor.sell();
        System.out.println("after");
    }

    public void ad() {
        System.out.println("before");
        mVendor.ad();
        System.out.println("after");
    }
}

如果代理函数很多的话,工作量就会比较大,动态代理的作用就提现了。

InvocationHandler接口

// 调度处理器
public interface InvocationHandler {
    Object invoke(Object proxy, Method method, Object[] args);
}

// 委托类定义
public class Vendor implements Sell {
    public void sell() {
        System.out.println("In sell method");
    }

    public void ad() {
        System,out.println("ad method");
    }
}

// 中介类
public class DynamicProxy implements InvocationHandler {
    //obj为委托类对象;
    private Object obj;

    public DynamicProxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before");
        Object result = method.invoke(obj, args);
        System.out.println("after");
        return result;
    }
}

// 执行

public class Main {
    public static void main(String[] args) {
        DynamicProxy inter = new DynamicProxy(new Vendor());
        //加上这句将会产生一个$Proxy0.class文件,这个文件即为动态生成的代理类文件
        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
        Sell sell = (Sell)(Proxy.newProxyInstance(Sell.class.getClassLoader(), new Class[] {Sell.class}, inter));

        sell.sell();
        sell.ad();
    }
}

代理模式

代理模式

上一篇下一篇

猜你喜欢

热点阅读