<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
動態代理的特點:
動態代理的別稱: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):
返回代理類的一個範例,返回後的代理類可以當作被代理類使用(可使用被代理類的在介面中宣告過的方法)
動態代的實現步驟:
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 深入淺出講解代理模式的文章就介紹到這了,更多相關Java 代理模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45