• 动态代理


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

    package lianxi2;
    // 静态代理类:代理类和被代理类必须配对,创建的数量如果很多,会很麻烦。
    interface SellHouse{
        void sellHouse();
    }
    class HouseProducer implements SellHouse{
    
        @Override
        public void sellHouse() {
          System.out.println("我是开发商,我要卖房子");
            
        }
    }
    class HouseProxy implements SellHouse{
        HouseProducer hp;
        public HouseProxy(HouseProducer hp) {
            super();
            this.hp = hp;
        }
    
        @Override
        public void sellHouse() {
             System.out.println("我是中介,我们代理开发商销售房子");
             hp.sellHouse();
        
        }
        
    }
    public class TestHouseProxy {
    
        
        public static void main(String[] args) {
            HouseProducer hp1 = new HouseProducer();
            HouseProxy pro1 = new HouseProxy(hp1);
            pro1.sellHouse();
    
        }
    
    }
    package lianxi2;
    //2.动态代理的使用
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    interface Food{
        void sellfood();
    }
    class FoodProduce implements Food{
    
        @Override
        public void sellfood() {
             System.out.println("我是食品生产商,负责提供食品");
            
        }
    }
    //代理类
    class MyinvocationHandler implements InvocationHandler{
        Object obj;  //实现接口的被代理类的对象的声明
        //1.给被代理类对象实例化 2.返回一个代理类对象
        public Object blind(Object obj){  
            this.obj = obj;
            return Proxy.newProxyInstance(this.getClass().getClassLoader(), 
                    this.getClass().getInterfaces(), this);
            
        }
        //当通过代理类的对象发起对被重写的方法调用时,转换为调用invoke方法
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            Object returnVal = method.invoke(obj, args); //方法返回值returnval
            return returnVal;
        }
        
    }
    public class TestDynamicProxy {
    
        public static void main(String[] args) {
            FoodProduce fp = new FoodProduce();
            MyinvocationHandler mh = new MyinvocationHandler();
            //调用builder方法,同样返回一个实现fp所在类实现的Food接口的代理类对象
            Object obj = mh.blind(fp);
            FoodProduce fp2 = (FoodProduce)obj;
            fp2.sellfood();
            
            HouseProducer hp1 = new HouseProducer();
            HouseProducer hp2 = (HouseProducer)mh.blind(hp1);
            hp2.sellHouse();
    
        }
    
    }
  • 相关阅读:
    Python定时任务利器—Apscheduler
    Python命令行模块(sys.argv,argparse,click)
    Rust安装和环境配置
    DBF 文件 ORACLE 数据库恢复
    认识 Cargo-Rust构建工具和包管理器
    VS Code 搭建 Rust 开发环境
    如何按名称或PID查找一个进程?如何按端口号查找一个进程?如何查看一个进程的CPU和内存、文件句柄使用情况?如何查看CPU利用率高的TOP10进程清单?如何根据PID强制终止进程?
    String 字符串
    JVM初探之类文件结构
    隐藏Windows不常用设置项
  • 原文地址:https://www.cnblogs.com/yjtm53/p/4166795.html
Copyright © 2020-2023  润新知