課程
/后端開發
/Java
/模式的秘密---代理模式
關于Proxy的正確解釋
2015-08-31
源自:模式的秘密---代理模式 2-3
正在回答
在這個例子中proxy沒有被使用到,只是占了個參數位。
解釋:
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();
上面紅色框起來的代碼,結果顯示為true。是不是表示proxy指的是被代理對象。該怎么解釋?
virgosoy
qq_為了美好的明天
是的,target是被代理的類對象,所以Test方法中傳遞的是Car對象
proxy,method,args都是代理類對象的實例,實例方法,實例方法的參數
而實現invoke方法中的method.invoke(car);正好也就是car.move()的反射
這個地方講的確實有問題。有點迷糊。關于proxy具體是干什么的有待探討
舉報
本節課程將帶你領略Java編程語言中代理模式的奧妙
1 回答invoke的參數proxy問題
2 回答TimeHandler類中invoke方法里method.invoke(target)怎么解釋?
1 回答Proxy參數問題
2 回答誰給解釋下代理到底是啥
1 回答使用Proxy靜態方法創建的是一個代理類?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2020-07-10
在這個例子中proxy沒有被使用到,只是占了個參數位。
2017-01-14
解釋:
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();
2016-06-23
上面紅色框起來的代碼,結果顯示為true。是不是表示proxy指的是被代理對象。該怎么解釋?
2016-03-30
是的,target是被代理的類對象,所以Test方法中傳遞的是Car對象
proxy,method,args都是代理類對象的實例,實例方法,實例方法的參數
而實現invoke方法中的method.invoke(car);正好也就是car.move()的反射
2015-10-29
這個地方講的確實有問題。有點迷糊。關于proxy具體是干什么的有待探討