基于子类的动态代理
发布日期:2021-05-10 19:06:21 浏览次数:21 分类:精选文章

本文共 1781 字,大约阅读时间需要 5 分钟。

导入环境

cglib
cglib
2.1_3



Producer.java

package com.itheima.cglib;/** * 一个生产者 */public class Producer {    /**     * 销售     * @param money     */    public void saleProduct(float money){        System.out.println("销售产品,并拿到钱:"+money);    }    /**     * 售后     * @param money     */    public void afterService(float money){        System.out.println("提供售后服务,并拿到钱:"+money);    }}

Client.java

package com.itheima.cglib;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/** * 模拟一个消费者 */public class Client {    public static void main(String[] args) {        final Producer producer = new Producer();        Producer cglibProducer = (Producer)Enhancer.create(producer.getClass(), new MethodInterceptor() {            /**             * 执行北地阿里对象的任何方法都会经过该方法             * @param proxy             * @param method             * @param args             *    以上三个参数和基于接口的动态代理中invoke方法的参数是一样的             * @param methodProxy :当前执行方法的代理对象             * @return             * @throws Throwable             */            @Override            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {                //提供增强的代码                Object returnValue = null;                //1.获取方法执行的参数                Float money = (Float)args[0];                //2.判断当前方法是不是销售                if("saleProduct".equals(method.getName())) {                    returnValue = method.invoke(producer, money*0.8f);                }                return returnValue;            }        });        cglibProducer.saleProduct(12000f);    }}

上一篇:spring中基于XML的AOP配置步骤
下一篇:基于接口的动态代理

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月23日 09时34分41秒