动态的代理

动态的代理

动态代理
      特点:字节码随用随创建,随用随加载
      作用: 不修改源码的基础上方法增强
      分类:
          基于接口的动态代理
          基于子类的动态代理
      基于接口的动态代理:
          涉及类:Proxy
          提供方: JDK官方
      如何创建代理对象
          使用proxy类中的newProxyInstance方法
      创建代理对象的要求
          被代理类至少实现一个接口,如果没有则不能使用
      newProxyInstance方法参数:
          ClassLoader: 类加载器
              它用于加载代理对象字节码的,和被代理对象使用相同的类加载器。固定写法
          Class[] : 字节码数组
              它是用于让代理对象和被代理对象有相同方法,固定写法。
          InvocationHandler: 用于提供增强的代码
              它是让我们如何写代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名
              内部类,但不是必须的。此接口的实现类都是谁写谁用。
              
     final Producer p = new Producer();

        IProducer iProducer = (IProducer)Proxy.newProxyInstance(p.getClass().getClassLoader(),
                    p.getClass().getInterfaces(),
                new InvocationHandler() {
                    /*作用:执行被代理对象的任何接口方法都会经过该方法
                      方法参数含义
                     * proxy: 代理对象的引用
                     * method: 当前执行的方法
                     * args: 当前执行方法所需的参数和被代理对象方法有相同的返回值
                     * */
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object returnValue = null;
                        System.out.println(args[0]+"限制性");
                        Integer money = (Integer) args[0];
                        if("sale".equals(method.getName())){
                            returnValue = method.invoke(p, money-100);
                        }


                        return returnValue;
                    }

                });
        iProducer.sale(1000);          
       

一种方法基于第三方的类 cglib库

特点:字节码随用随创建,随用随加载
      作用: 不修改源码的基础上方法增强
      分类:
          基于接口的动态代理
          基于子类的动态代理
      基于接口的动态代理:
          涉及类:Enhancer
          提供方: 第三方cglib库
      如何创建代理对象
       使用Enhancer类中的create方法
      创建代理对象的要求
          被代理类不能是最终类
      create方法参数:
          Class: 字节码
               它用于指定被代理对象的字节码
              它是用于让代理对象和被代理对象有相同方法,固定写法。
          Callback: 用于提供增强的代码
              它是让我们如何写代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名
              内部类,但不是必须的。此接口的实现类都是谁写谁用。
              我们一般写的都是该类接口的子接口实现类:MethodInterceptor
              
               final Producer p = new Producer();

        Producer producer = (Producer) Enhancer.create(p.getClass(), new MethodInterceptor() {
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                /*
                * proxy
                * method
                * args
                * 以上三个方法和invoke一样
                * */
                Object returnValue = null;
                Integer money = (Integer) args[0];
                System.out.println(money+"vfjgds");
                if ("sale".equals(method.getName())) {
                    returnValue = method.invoke(p, money - 100);
                }
                return returnValue;
            }
        });
        producer.sale(10000);
              

应用: 使用动态代理实现事务控制。

为解决配置文件的繁琐,用的是AOP技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值