java动态代理cglib基于子类代码增强案例

可紊 提交于 2020-03-09 15:39:33

相对于Proxy不同的是,Proxy是基于接口的动态代理,而cglib是子类的

第一步导入cglib的jar包

<dependencies>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.12</version>
        </dependency>
    </dependencies>

普通类

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);
    }
}

测试类

/**
 * 模拟一个消费者
 * @author DELL
 */
public class Client {
    public static void main(String[] args) {
       final Producer producer = new Producer();
//        producer.saleProduct(10000f);

        /**
         * 基于子类的动态代理
         * 基于子类的动态代理:
         *  涉及的类: Enhancer
         *  提供者:第三方cglib库
         *  创建代理对象: 使用Enhancer类中的create方法
         *  创建代理对象的要求:
         *      被代理类不能是最终类
         *
         *   class 字节码
         *      它是用于指定被代理对象的字节码
         *
         *    Callback用于增强的代码
         */
       Producer cglibProduce =  (Producer)Enhancer.create(producer.getClass(), new MethodInterceptor() {
            /**
             * 执行该方法的任何方法都会经过该方法
             * @param o
             * @param method
             * @param objects
             * @param methodProxy  当前执行方法的代理对象
             *
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                //提 供增强的代码
                Object returnValue = null;
                //1.获取方法执行的参数
                Float money = (Float)objects[0];
                if("saleProduct".equals(method.getName())){
                    returnValue = method.invoke(producer, money*0.8f);
                }
                return returnValue;
            }
        });
        cglibProduce.saleProduct(10000f);
    }
}

可用看出拦截方法之后和Proxy的处理大同小异
Proxy实现代理

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!