java开发,必须要懂的23种设计模式——代理模式(Cglib代理)

目录

Cglib代理是什么?

Cglib小案例

引入glib库

撸代码

总结:


Cglib代理是什么?

JDK代理,原理是实现同一个接口去实现代理的。

而Cglib的原理是,实现你提供的目标类作为父类,在内存中生成一个子类去继承目标类,实现的。

Cglib小案例

引入glib库

cglib是第三方的一个代码生成库,所以我们使用的时候需要先引入库。

1. jar包下载:

https://lanzous.com/id7zpsd

下载解压后可以看见这四个jar包

2. 添加依赖

先把四个jar包复制到需要使用的项目中

然后添加依赖

撸代码

假设你是卖面膜的,我是你的代理。我可以把面膜卖给我的朋友。

你——被代理者

package 代理模式.cglib代理;
// 你是被代理对象
public class You {

	public void sellMask() {
		System.out.println("卖面膜");
	}

}

代理工厂(可以生成代理)

这个类并不是代理类,而是调用了Cglib的方法生成了一个代理类,并且把代理类返回给调用者。

package 代理模式.cglib代理;

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 ProxyFactory implements MethodInterceptor{

	private Object target;

	public ProxyFactory(Object target) {
		this.target=target;
	}

	public Object getYouInstance() {
		// 创建一个用于生成代理类的工具类
		Enhancer enhancer = new Enhancer();
		// 设置被代理类
		enhancer.setSuperclass(target.getClass());
		// 设置处理类
		enhancer.setCallback(this);
		// 返回创建的代理类
		return enhancer.create();

	}

	// 处理代理方法调用
	@Override
	public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
		System.out.println("我是代理,能把面膜卖给自己的盆友");
		Object returnVal = method.invoke(target, args);
		return returnVal;
	}
}

我的朋友——客户端

package 代理模式.cglib代理;
// 相当于客户端
public class MyFriend {

	public static void main(String[] args) {
		// 被代理对象
		You you = new You();
		
		// 获取Cglib代理对象
		You me = (You) new ProxyFactory(you).getYouInstance();
		me.sellMask();
	}

}

运行结果:
 

我是代理,能把面膜卖给自己的盆友
卖面膜

总结:

Cglib代理的使用步骤:

1. 导入jar包

2. 添加依赖

3. 调用Enhancer的方法生成代理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章