您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java代理模式實例代碼分析的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
動態代理的特點:
當代理對象的時候,不需要實現接口
代理對象的生成,是利用JDK的API,動態的在內存中構建代理對象(需要我們指定創建代理對象/目標對象實現的接口的類型)
動態代理的別稱:JDK代理、接口代理
類圖:
Java動態代理類位于java.lang.reflect包下
一般主要涉及到以下兩個類:
1、Interface InvocationHandler : 該接口中僅定義了一個方法public object invoke(Object obj,Method method, Object[] args) 在實際使用時,第一個參數obj一般是指代理類,method是被代理的方法,args為該方法的參數數組。這個抽象方法在代理類中動態實現。
2、Proxy:該類即為動態代理類
static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h):
返回代理類的一個實例,返回后的代理類可以當作被代理類使用(可使用被代理類的在接口中聲明過的方法)
動態代的實現步驟:
創建一個實現接口InvocationHandler的類,它必須實現invoke方法
創建被代理的類以及接口
調用Proxy的靜態方法,創建一個代理類:newProxyInstance(ClassLoader loader,Class[]
通過代理調用方法
比如現在有一個汽車駕駛的方法:
public interface Moveable { void move(); }
現在有一輛汽車:
//實現Moveable 接口,并隨機暫停一段時間 import java.util.Random; public class Car implements Moveable{ @Override public void move() { try{ Thread.sleep(new Random().nextInt(1000)); System.out.println("汽車行駛中"); } catch (InterruptedException e) { e.printStackTrace(); } } }
時間代理類:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class TimeHandler implements InvocationHandler{ public TimeHandler(Object target){ super(); this.target = target; } private Object target; /** * * @param proxy :被代理的對象 * @param method:被代理對象的方法 * @param args:方法的參數 * @return * @throws Throwable * 返回值:Object 方法的返回值 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { long startTime = System.currentTimeMillis(); System.out.println("汽車開始行使"); method.invoke(target); long endTime = System.currentTimeMillis(); System.out.println("汽車行駛結束,行駛的時間為:"+(endTime-startTime)+"毫秒"); return null; } }
測試類:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { Car car = new Car(); InvocationHandler h = new TimeHandler(car); Class<?> cls = car.getClass(); /** * newProxyInstanced的參數 * 分別是:類加載器、實現的接口、實現的處理器 */ Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),h); m.move(); } }
這樣的輸出結果是:
汽車開始行使
汽車行駛中
汽車行駛結束,行駛的時間為:137毫秒
//后面的時間是隨機產生的,每次都不一樣
注意:
JDK代理只能代理實現了接口的類,沒有實現接口的不能代理
以上就是JDK動態代理,當然還有cglib動態代理:
cglib是針對類來實現代理的,cglib的原理是對指定的目標類生成一個子類,并覆蓋其中方法實現增強,但因為采用的是繼承,所以不能對final修飾的類進行代理,因為小應學長自己對這一塊也沒有完全掌握,這里就不多講解,大家可以參考其他博主的技術文章。
以上就是“Java代理模式實例代碼分析”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。