<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
當我們需要呼叫某個類(具體實現類)的方法時,不直接建立該類的物件,而是拿到該類的代理類物件,通過代理物件,呼叫具體實現類的功能。具體實現類和代理類都實現同樣的介面,並且代理類持有實現類的物件。這樣做在呼叫端和具體實現端,做了一層隔離,避免直接打交道。
代理模式在現實中也有很多類似的例子,比如我們買房租房,都得通過中介,這個中介就相當於代理。
1)定義介面:
public interface IHouse { void sallHouse(); int sallHouse2(); }
2)具體實現類:
public class Andy implements IHouse { @Override public void sallHouse() { System.out.println("andy sall house.."); } @Override public int sallHouse2() { return 100; } }
3)代理類:
public class HouseProxy implements IHouse { Andy andy; public HouseProxy(Andy andy) { this.andy = andy; } @Override public void sallHouse() { andy.sallHouse(); } @Override public int sallHouse2() { return andy.sallHouse2(); } }
4)使用者端呼叫:
//1.建立被代理物件 Andy andy = new Andy(); //2.建立代理物件,代理物件持有被代理物件的參照 HouseProxy proxy = new HouseProxy(andy); //3.使用者端通過代理物件呼叫。 proxy.sallHouse();
//1.被代理物件 final Andy andy = new Andy(); //2.建立動態代理,Java在執行時動態生成的。 ClassLoader classLoader = andy.getClass().getClassLoader(); Class[] interfaces = andy.getClass().getInterfaces(); IHouse iHouse = (IHouse) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() { @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { //通過反射呼叫被代理物件的方法 return method.invoke(andy, objects); } }); //3.使用者端通過代理物件呼叫被代理方法。 iHouse.sallHouse();
動態代理分析:
1)IHouse iHouse = (IHouse) Proxy.newProxyInstance();
建立動態代理物件,
有三個引數:
1.ClassLoader 類載入器
2.被代理介面的Class類,
3.InvocationHandler介面實現類
2)拿到iHouse動態代理後,呼叫介面的方法iHouse.sallHouse();
這個方法一被呼叫,就會執行InvocationHandler類中invoke方法。
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
//通過反射呼叫被代理物件的方法
return method.invoke(andy, objects);
}
invoke方法有三個引數:
method,就是代理類呼叫的方法名(sallHouse)
objects,就是代理類呼叫方法時傳遞的引數。
Object obj = method.invoke(andy, objects);
通過反射機制 呼叫andy物件,具體實現者中對應的方法。
他的返回值,可以在代理物件呼叫介面時接收,是什麼型別,就返回什麼型別。Retrofit就是這樣做的
動態代理的原理是什麼?
到此這篇關於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