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

    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();
    
        }
    
    }
  • 相关阅读:
    UILabel 设置字体间的距离 和 行与行间的距离
    IB_DESIGNABLE 和 IBInspectable 的使用
    干货博客
    GitHub克隆速度太慢解决方案
    实时(RTC)时钟,系统时钟和CPU时钟
    折腾了好久的vscode配置c/c++语言环境(Windows环境下)
    c语言中的malloc函数
    记录一下关于在工具类中更新UI使用RunOnUiThread犯的极其愚蠢的错误
    记录关于Android多线程的一个坑
    Android中限制输入框最大输入长度
  • 原文地址:https://www.cnblogs.com/yjtm53/p/4166795.html
Copyright © 2011-2022 走看看