美文网首页
Java之 动态代理

Java之 动态代理

作者: 五月笙 | 来源:发表于2021-08-27 14:41 被阅读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();
        }
    }
    
    

    代理模式

    代理模式

    相关文章

      网友评论

          本文标题:Java之 动态代理

          本文链接:https://www.haomeiwen.com/subject/nkumnktx.html