JDK动态代理 & CGLib动态代理实例

本文详细解析了JDK动态代理和CGLIB动态代理的工作原理及应用场景。JDK动态代理适用于实现了接口的类,而CGLIB则通过生成目标类的子类来实现代理,适用于未实现接口的类,但需注意避免final修饰的类或方法。通过具体代码示例,展示了两种代理方式的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接口
public interface IUserManager {
	void addUser(String nickName,String password);
}
实现类1
public class UserManaerImpl implements IUserManager{
	@Override
	public void addUser(String nickName, String password) {
		System.out.println("UserManaerImpl - Add user - nickName:" + nickName + "password:" + password);
	}
}
实现类2
public class UserManagerImpl2 implements IUserManager{
	@Override
	public void addUser(String nickName, String password) {
		System.out.println("UserManagerImpl2 - Add user - nickName:" + nickName + " password:" + password);
	}
}
JDK动态代理
public class JDKDynamicProxy implements InvocationHandler {
	private Object targetObject;
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("数据缓冲...");
		Object result = method.invoke(targetObject,args);
		System.out.println("日志记录...");
		return result;
	}

	public Object getProxy(Object targetObject){
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this);
	}
}
CGLib动态代理
public class CGLibDynamicProxy implements MethodInterceptor {
	private Object targetObject;
	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		System.out.println("数据缓冲...");
		Object result = method.invoke(targetObject,args);
		System.out.println("日志记录...");
		return result;
	}

	public Object getProxy(Object targetObject){
		this.targetObject = targetObject;
		return Enhancer.create(targetObject.getClass(),targetObject.getClass().getInterfaces(),this);
	}
}
测试类
@RunWith(SpringJUnit4ClassRunner.class)
public class MyProxyTest {

	@Test
	public void test1(){
		JDKDynamicProxy jdkDynamicProxy1 = new JDKDynamicProxy();
		IUserManager userManager1 = (IUserManager) jdkDynamicProxy1.getProxy(new UserManaerImpl());
		userManager1.addUser("NickName","PassWord");

		JDKDynamicProxy jdkDynamicProxy2 = new JDKDynamicProxy();
		IUserManager userManager2 = (IUserManager) jdkDynamicProxy2.getProxy(new UserManagerImpl2());
		userManager2.addUser("NickName","PassWord");

		CGLibDynamicProxy cgLibDynamicProxy = new CGLibDynamicProxy();
		IUserManager userManager = (IUserManager)cgLibDynamicProxy.getProxy(new UserManaerImpl());
		userManager.addUser("NickName","Password");

		CGLibDynamicProxy cgLibDynamicProxy2 = new CGLibDynamicProxy();
		IUserManager userManager3 = (IUserManager)cgLibDynamicProxy2.getProxy(new UserManagerImpl2());
		userManager3.addUser("NickName","Password");
	}

}

1)JDK应用场景:只能代理实现了接口的类

2)CGLIB应用场景:是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,

     并覆盖其中方法实现增强,但是因为采用的是继承,所以该类或方法最好不要声明成final,

     对于final类或方法,是无法继承的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值