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的方法生成代理

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