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方法可以拦截请求,在请求到达目标方法之前和之后做出业务处理。
运行结果:


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

被折叠的 条评论
为什么被折叠?



