Ⅰ java 我不理解動態代理的意義
人家是動態編程,需要在原來的方法的功能基礎上再添加一些功能,而不用改變這個方法的簽名,原來調用這個方法的類依然能正常工作。
比如,現在要把一段文本發送給另一個人,普通方法是 void send(File a),現在我們弄出個特性,就像 Spring AOP 那樣,在 send 之前給這個 a 壓縮一下。原來的程序沒有壓縮功能,現在我們需要添加的話而不改變原來所有的代碼的話就得用類似 AOP 這樣的代碼來處理。
一般一個無法再繼承的類和方法,要用代理,而能夠繼承的類和方法可以在內在中直接生成一個新的 java 類繼承它然後覆蓋掉那個 send 方法,像 hibernate/spring/jboss 都把這些自動完成了。
而像 AspectJ 這種 AOP 剛不同,它直接把人家的 class 代碼修改了,它就不需要使用代理。
這些在新的 JDK 6 中都可以通過 Instrument 來做到,不過也是個通用的方法,還得通過規則來定製什麼情況下處理,什麼時候不處理。
Ⅱ java 動態代理有什麼作用有什麼優點解決了什麼問題不要用程序來說,就直接用語言描述。謝謝了
簡單來說可以隱藏實現,比如將你與A的交互通過代理將實現轉變為與B的交互,其中關鍵一點是如果在實現中保留一個對自己的對象的引用的話,就可以達到動態增強代理類功能的目的。
Ⅲ java的代理模式有何用,直接調用用實現類不就行了嗎,幹嘛多此一舉呢。。。。
使用代理類可以在實現類的基礎上進行擴展,可以在方法中動態加入代碼。這里要理解的是,實現類和代理類都是繼承了同一個介面的(必須的)舉個例子,如果你要通過一個實現類,將文本控制項中輸入的數字,做 加減乘除(也許還有很多運算) 法的運算,你發現這樣會有一些問題存在,字元串如果不能轉換成數字,就會報錯。那麼,你必須在方法的開頭加入驗證判斷。但是,你又發現每個方法都要寫驗證是很麻煩的,而且代碼量也會很多。於是你將驗證抽取出來,成為一個方法。 每個運算方法都在開頭調用這個驗證就行了。這樣是沒有問題的。然而,如果這個實現類不是你寫的,是A程序員寫的,而A程序員覺得他無法知道,使用這個實現類的程序員是否希望驗證這個字元串,所以,他把字元串的驗證工作交給了調用的程序員。而你在使用這個實現類的時候,你不能修改這個實現類,給他的每個方法開頭加入字元串的驗證。那麼怎麼去讓這個實現類的每個運算方法都在調用前都去驗證一下呢?代理就可以動態的在每個方法前加入驗證,比如add(int,int)方法,如果調用代理類的方法,代理類將先做驗證,然後再去調用實現類的方法。這個是有必要的,因為代理的動態的加入驗證代碼,不需要每個方法錢都加入驗證。最後總結一下,代理的作用大多是實現類的實現,對於調用者特定功能來說,做的還不夠,這代理,可以加入那些還不夠的代碼,然後再去調用實現類。
Ⅳ java中的代理有什麼用
主要就是包裝被代理類,注冊一個回調類,攔截被代理類調用,執行相關操作,spring的aop就可以用代理來實現
Ⅳ java中的代理是什麼意思
動態代理在Java中是很重要的一部分,在很多框架中都會用到,如Spring中的AOP、Hadoop中的RPC等。為此在這把我對Java中的動態代理的理解分享給大家,同時寫了一個模擬AOP編程的實例。
有兩種方法可以實現,一種是利用繼承,另一種是利用聚合。舉例說明:
假設第三方中提供一個Run介面,裡面只一個run方法,以及它的實現類Person。
Run.java
如果要對第三方提供的JAR包中的某個類中的某個方法的前後加上自己的邏輯,比如打LOG,注意此時我們只有第三方提供的CLASS文件,因此根本不可能去修改別人的源代碼,那該怎麼辦?
有兩種方法可以實現,一種是利用繼承,另一種是利用聚合。舉例說明:
假設第三方中提供一個Run介面,裡面只一個run方法,以及它的實現類Person。
Run.java
如果要對第三方提供的JAR包中的某個類中的某個方法的前後加上自己的邏輯,比如打LOG,注意此時我們只有第三方提供的CLASS文件,因此根本不可能去修改別人的源代碼,那該怎麼辦?
有兩種方法可以實現,一種是利用繼承,另一種是利用聚合。舉例說明:
假設第三方中提供一個Run介面,裡面只一個run方法,以及它的實現類Person。
Run.java
分析動態代理過程
1.根據輸入的介面,利用反射機制,肯定可以拿到有哪些方法;
2.根據輸入的被代理類,同樣利用反射機制,肯定去調用其實現的方法。
到了這里,好像少了一點東西,就是少了對某個方法的前後的加強的邏輯。
Ⅵ java動態代理是什麼
import java.lang.reflect.Proxy;
A. 創建一個實現介面InvocationHandler的類,他必須實現invoke方法
B. 創建被代理的類以及介面。
C. 通過Proxy的靜態方法newProxyInstance(ClassLoader loader,Class【】interfaces,InvocationHandler handler)創建一個代理
D. 通過代理調用方法。
java動態代理:是在運行是生成的class對象,在生成時必須提供一組或一個interface給它,然後該class就宣稱它實現了這些interface。你當然可以把該class的實例當做這些interface中的任何一個來用,當然,這個DynamicProxy其實就是一個Proxy,他不會替你做實質性的工作,在生成它的實例時你必須提供一個handler,由它接管實際的工作。因此,DynamicProxy必須實現InvocationHandler介面。
5) 一個動態代理了和一個InvocationHandler 實現關聯的。每一個動態代理實例的調用都要通過InvocationHandler介面的handler(調用處理器)來調用,動態代理不做任何執行操作,只是在創建動態代理時,把要實現的介面和handler關聯,動態代理要幫助被代理執行的任務,要轉交給handler來執行。其實就是調用invoke方法。