zoukankan      html  css  js  c++  java
  • 动态代理

    package com.java.exec2;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.Objects;
    
    /**
     * Created by zhangyanana    on 2017/3/16.
     */
    //动态代理的使用
    interface Subject {
        void action();
    }
    
    //被代理类
    class RealSubject implements Subject {
    
        @Override
        public void action() {
            System.out.println("我是被代理类,真正执行的是我");
        }
    }
    //代理类
    class MyInvocationHandler 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方法的调用
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object invoke = method.invoke(obj, args);
            return invoke;
        }
    }
    
    public class TestProxy {
        public static void main(String[] args) {
            //1.被代理类对象
            RealSubject real = new RealSubject();
            //2.创建一个实现了InvocationHandler接口的类的对象
            MyInvocationHandler handler =new MyInvocationHandler();
            //3.调用blind()方法。动态的返回一个同样实现了real所在类实现的接口Subject的代理类的对象
            Object obj = handler.blind(real);
            Subject sub = (Subject)obj;//此时的sub就是代理类的对象
    
            sub.action();//转到对invoke()方法的调用
    
            //另一个例子
            NikeClothFactory nike = new NikeClothFactory();
            ClothFactory proxyCloth = (ClothFactory) handler.blind(nike);//proxyCloth即为代理类的对象
            proxyCloth.productCloth();
    
        }
    }
  • 相关阅读:
    【Rust】结构体 struct
    【Rust】所有权、引用、借用
    Centos7升级glibc2.24
    ES用户权限控制
    PHP压缩html网页代码 : 清除空格,制表符,注释标记
    PHP通过HTTP_USER_AGENT判断是否为手机移动终端的函数
    php正则表达式替换URL链接地址为指定url的形式
    PHP下使用CURL方式POST数据至API接口的方法
    设计模式代理模式
    设计模式生成器模式
  • 原文地址:https://www.cnblogs.com/zhyn-BeHard/p/6559713.html
Copyright © 2011-2022 走看看