亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

老師說錯了,這里是Proxy的正確解釋

關于Proxy的正確解釋

http://img1.sycdn.imooc.com//55e3f9ec00016f3b06810563.jpg

正在回答

5 回答

在這個例子中proxy沒有被使用到,只是占了個參數位。

0 回復 有任何疑惑可以回復我~

解釋:

1. ? ? Proxy即動態代理類;

2. ? ? Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理類的一個實例,返回后的代理類可以當作被代理類使用;

它有三個參數:

ClassLoader loader ? ?----指定被代理對象的類加載器

Class[] Interfaces ? ?----指定被代理對象所以事項的接口

InvocationHandler h ?----指定需要調用的InvocationHandler對象

3. ? ? 實現InVocationHandler接口的LogHandler_old對象

這個對象的invoke()方法就是Proxy這個動態代理類所代理的接口類的抽象方法的真實實現;

它有三個參數:

Object proxy ? ? ? ? ?-----代理類對象

Method method ? ? ? ? -----被代理對象的方法(這里不是接口的抽象方法了,是具體的實現類中的方法)

Object[] args ? ? ? ? -----該方法的參數數組


JDK中具體的動態代理類是怎么產生的呢?

1.產生代理類$Proxy0類

執行了Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

將產生$Proxy0類,它繼承Proxy對象,并根據第二個參數,實現了被代理類的所有接口,自然就可以生成接口要實現的所有方法了(這時候會重寫hashcode,toString和equals三個方法),但是還沒有具體的實現體;

2. ? ?將代理類$Proxy0類加載到JVM中

這時候是根據Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)它的第一個參數----就是被代理類的類加載器,把當前的代理類加載到JVM中

3. ? ?創建代理類$Proxy0類的對象

調用的$Proxy0類的$Proxy0(InvocationHandler)構造函數,生成$Proxy0類的對象

參數就是Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)它的第三個參數

這個參數就是我們自己實現的InvocationHandler對象,我們知道InvocationHandler對象中組合加入了代理類代理的接口類的實現類;所以,$Proxy0對象調用所有要實現的接口的方法,都會調用InvocationHandler對象的invoke()方法實現;

4. ? ?生成代理類的class byte

動態代理生成的都是二進制class字節碼

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

動態代理是很多框架和技術的基礎, spring

的AOP實現就是基于動態代理實現的。了解動態代理的機制對于理解AOP的底層實現是很有幫助的。

Proxy類的設計用到代理模式的設計思想,Proxy類對象實現了代理目標的所有接口,并代替目標對象進行實際的操作。但這種替代不是一種簡單的替代,這樣沒有任何意義,代理的目的是在目標對象方法的基礎上作增強,這種增強的本質通常就是對目標對象的方法進行攔截。所以,Proxy應該包括一個方法攔截器,來指示當攔截到方法調用時作何種處理。InvocationHandler就是攔截器的接口。

InvocationHandler接口也是在java.lang.reflec

Object invoke(Object proxy, Method method, Object[] args)

這個接口有三個參數,其中第二和第三個參數都比較好理解,一個是被攔截的方法,一個是該方法的參數列表。關鍵是第一個參數。按照doc文檔的解析,

proxy - the proxy instance that the method was invoked on

也就是說,proxy應該是一個代理實例,但為什么要傳入這個參數呢?

帶著這個問題,自己編了個小程序作了一點試驗。

///////////////////////////////////////

public interface IAnimal {

void info();


2 回復 有任何疑惑可以回復我~

http://img1.sycdn.imooc.com//576bdd4c0001257109550576.jpg

上面紅色框起來的代碼,結果顯示為true。是不是表示proxy指的是被代理對象。該怎么解釋?

1 回復 有任何疑惑可以回復我~
#1

virgosoy

代理對象和被代理對象都實現了同個接口。。proxy是代理對象,你可以直接getClass()看它的類型。
2016-11-18 回復 有任何疑惑可以回復我~
#2

qq_為了美好的明天

jiushi
2017-09-08 回復 有任何疑惑可以回復我~

是的,target是被代理的類對象,所以Test方法中傳遞的是Car對象

proxy,method,args都是代理類對象的實例,實例方法,實例方法的參數

而實現invoke方法中的method.invoke(car);正好也就是car.move()的反射

0 回復 有任何疑惑可以回復我~

這個地方講的確實有問題。有點迷糊。關于proxy具體是干什么的有待探討

1 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

老師說錯了,這里是Proxy的正確解釋

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號