动态代理模式的第二种方式:cglib动态代理

这篇博客介绍了CGLIB库在Java中用于动态代理的实现方式。通过创建一个Enhancer实例,设置目标类并定义MethodInterceptor,实现了在方法调用前后添加额外的业务逻辑。案例展示了如何拦截`buy`方法,代理收取20%代理费并在厂家优惠基础上再赚取20%手续费。运行结果显示了代理操作的过程。
摘要由CSDN通过智能技术生成

cglib是功能强大,性能高的开源项目,它可以在运行期扩展Java类与实现Java接口。cglib的底层需要依赖asm,asm是一个字节码处理的框架,它可以转换字节码文件,并生成新的类。

cglib动态代理模式案例:

导包:

接口:

package cglibProxy;

//接口:相当于协议
public interface GoodsService {
	int buy(double money);
}

实现类:

package cglibProxy;

//生产厂家
public class GoodsServiceImpl implements GoodsService {

	@Override
	public int buy(double money) {
		System.out.println("生产厂家收到货款:" + money);
		//返回200元作为客户优惠
		System.out.println("厂家返回200元作为客户优惠");
		return 200;
	}

}

测试类:

package cglibProxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class TestCglib {

    //客户买电脑
	public static void main(String[] args) {
		//字节码增强器
		Enhancer enhancer = new Enhancer();
		
		enhancer.setSuperclass(GoodsServiceImpl.class);
		enhancer.setCallback(new MethodInterceptor() {
			@Override
			public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
				double money = Double.parseDouble(args[0].toString());
				System.out.println("代理收取20%代理费:"+money * 0.2);
				args[0] = money * 0.8;
				Object obj = methodProxy.invokeSuper(proxy, args);
				//代理拿到厂家给客户的优惠后,以手续费为由再次赚取20%,80%给客户
				double x = Double.parseDouble(obj.toString()) * 0.2;
				System.out.println("代理赚取20%手续费:" + x);
				double y = Double.parseDouble(obj.toString()) * 0.8;
				return y;
			}
		});
        //代理对象
		GoodsServiceImpl proxy = (GoodsServiceImpl) enhancer.create();
		int z = proxy.buy(9000);
		System.out.println("客户最终收到厂家的优惠是:" + z);
	}
}

cglib动态代理模式必须实现MethodInterceptor接口,该接口中有intercept方法可以拦截请求,在请求到达目标方法之前和之后做出业务处理。

运行结果:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值