jdk与cglib区别

本文探讨了JDK和CGlib两种Java动态代理技术。JDK代理需要被代理类实现至少一个接口,使用Proxy类并在InvokeHandler中处理方法调用。而CGlib则适用于未实现接口的类,它基于ASM库生成子类来实现代理,通过MethodInterceptor的intercept()方法处理切面逻辑。
摘要由CSDN通过智能技术生成

1.jdk:

提供者:jdk

前提条件: 被代理类必须实现一个接口

核心类:Proxy

Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h);
参数1:类加载: 随用随创建,边用边加载  加载被代理角色 的字节码文件
参数2:字节码数组: 和被代理角色提供相同的字节码文件
参数3:就是对业务方法进行增强参数: 代理的处理程序,要么提供接口子实现类,要么接口匿名内部类

在调用具体方法前调用InvokeHandler来处理。核心是实现InvocationHandler接口,使用invoke()方法进行面向切面的处理

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
	retunrn null;
}
参数1: proxy ,代理对象的引用
参数2: method ,当前要执行的方法
参数3:  args ,当前执行方法的形参

2.cglib(Code Generation Library)

提供者:cglib.jar包

前提条件:非接口类,非final类,非final方法

核心类:Enhancer

Enhancer.create(producer.getClass(), new MethodInterceptor() {});

参数1:当前被代理角色的字节码文件
参数2:CallBack 接口,其子接口:MethodInteceptor,将业务方法进行拦截 相当于jdk动态代理中invocationHander

glib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。核心是实现MethodInterceptor接口,使用intercept()方法进行面向切面的处理

@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
	return null;
}
参数1:代理对象的引用
参数2:当前执行的业务方法
参数3:执行业务方法的总参数    前三个与jdk动态代理   invoke 的参数一致

参数4:方法代理产生的引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值