首页 > 编程语言 > 详细

TZ_05_Spring_Proxy基于接口的动态代理和基于类的动态代理

时间:2019-08-11 22:04:48      阅读:96      评论:0      收藏:0      [点我收藏+]

代理:为了增强方法在不添加代码的情况下

1.Proxy基于接口的动态代理

/**
 * 模拟一个消费者
 * @author Administrator
 *
 */
public class Client {
    public static void main(String[] args) {
        final Prodecer prodecer = new Prodecer();
        /**
         * 动态代理:
         *       特点:字节码随用随创建,随用随加载
         *   作用:不修改源码的基础上对方法增强
         *   分类:
         *        1.基于接口的动态代理
         *        2.基于子类的动态代理 
         *   基于接口的动态代理
         *        涉及的类:Proxy
         *        提供者 :jdk官方
         *   如何创建代理对象:
         *        使用Proxy类中的newProxyInstance方法
         *   创建代理类的要求
         *        被代理的类最少实现一个接口, 
         *   newProxyInsttance方法参数,
         *        参数 :Classloader  累加载器:用于加载代理对象字节码的。和被代理对象使用相同的类加载器
         *              nterfaces   被代理对象实现的接口
         *              InvocationHandler 他是让我们如何写代理,我们一般写该接口的实现类。通常写匿名内部类
         *     
         */
        IProdecer proxyProducer = (IProdecer) Proxy.newProxyInstance(prodecer.getClass().getClassLoader(),
                prodecer.getClass().getInterfaces(), new InvocationHandler() {
            
                    /**
                     * 作用:执行被代理对象的任何接口方法都会经过该方法
                     *         proxy 代理对象的引用
                     *         method 当前执行的方法
                     *         args  当前方法执行所需的参数
                     */        
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //提供增强的代码
                        Object returnValue=null;
                        //1.获取方法执行的参数
                        float money=(Float) args[0];
                        //判断当前方法是不是saleProdect
                        if ("saleProdect".equals(method.getName())) {
                            returnValue=method.invoke(prodecer, money*0.8f);
                        }
                        return returnValue;
                    }
                });
        proxyProducer.saleProdect(1000f);
        
    }

    
}

 

2.基于类的动态代理

/**
 * 模拟一个消费者
 * @author Administrator
 *
 */
public class Client {
    public static void main(String[] args) {
        final Prodecer prodecer = new Prodecer();
        /**
         * 动态代理:
         *   特点:字节码随用随创建,随用随加载
         *   作用:不修改源码的基础上对方法增强
         *   分类:
         *       1.基于接口的动态代理
         *       2.基于子类的动态代理 
         *   基于类的动态代理
         *       涉及的类:Enhancer
         *       提供者 :第三方cglib库
         *   如何创建代理对象:
         *      使用Enhance类中的create方法
         *   创建代理类的要求
         *       被代理的类不能是最终类
         *   create方法参数,
         *     参数 :  Class:字节码 用于指定被代理对象的字节码
         *             callback 他是让我们如何写代理,我们一般写该接口的子接口的实现类。通常写匿名内部类
         *             methodProxy:当前执行方法的代理对象
         */
        Prodecer cglibProdecer=(Prodecer) Enhancer.create(prodecer.getClass(), new MethodInterceptor() {
            
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                //提供增强的代码
                Object returnValue=null;
                //1.获取方法执行的参数
                float money=(Float) args[0];
                //判断当前方法是不是saleProdect
                if ("saleProdect".equals(method.getName())) {
                    returnValue=method.invoke(prodecer, money*0.8f);
                }
                return returnValue;
            }
        });
        cglibProdecer.saleProdect(1000f);
        
    }

    
}

 

TZ_05_Spring_Proxy基于接口的动态代理和基于类的动态代理

原文:https://www.cnblogs.com/asndxj/p/11336497.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!