2018-10-21 java代理模式

關鍵字:代理模式,方法增強、方法攔截

代理可以在不改動目標對象的基礎上,增加其他額外的功能(擴展功能)。

也就是在目標對象的邏輯上,加上一些其他的邏輯,組成了 整個代理對象的邏輯;



代理分為:

1、靜態代理

代理對象proxy,與目標對象,需要有相同的接口實現或者繼承相同父類,以便通過外部傳入目標對象,代理對象proxy拿到目標對象的接口,然后在其對接口的實現中,再次擴展自己的一些東西;

也就是代理對象實現與目標對象相同的接口,但在實現接口中加入擴展的東西+目標對象的實現;

因為代理對象需要實現目標對象相同的接口,如果目標對象的接口增減,代理對象的接口也需要維護;

2、動態代理(jdk代理)

目標對象要有接口的實現,但代理對象不需要實現接口,通過JDK動態生成代理對象proxy(需要我們指定創建代理對象/目標對象實現的接口的類型);

主要是通過Proxy.newProxyInstance(目標對象的classLoader, 目標對象的接口, InvocationHandler對象),在InvocationHandler中寫你的代理對象的實現邏,也是靜態代理中寫的邏輯搬到了這里。

這種模式較靜態代理更方便維護目標對象接口的變化;

3、cglib代理

JDK的動態代理機制只能代理實現了接口的類,而不能實現接口的類就不能實現JDK的動態代理,cglib是針對類來實現代理的,他的原理是對指定的目標類生成一個子類,并覆蓋其中方法實現增強,但因為采用的是繼承,所以不能對final修飾的類進行代理。 另外,目標對象的方法如果為final/static,那么就不會被攔截,即不會執行目標對象額外的業務方法,這種需要注意。

Cglib代理,也叫作子類代理,它是在內存中構建一個子類對象從而實現對目標對象功能的擴展;

但是 這個cglib不支持android平臺在android中使用不了;但github上有一個模仿cglib的寫法做了一部分適配;

https://github.com/zhangke3016/MethodInterceptProxy

cglib使用場景:http://www.lxweimin.com/p/08203d371f1c

java代理:https://www.cnblogs.com/linzhong/p/7234051.html

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容