直奔主題,
靜態(tài)代理
由程序員創(chuàng)建或工具生成代理類的源碼,再編譯代理類。在程序運行前就已經存在代理類的字節(jié)碼文件刑棵,代理類和委托類的關系在運行前就確定了
-
優(yōu)點
業(yè)務類只需要關注業(yè)務邏輯本身,保證了業(yè)務類的重用性愚铡。這是代理的共有優(yōu)點蛉签。
-
缺點
1.代理對象的一個接口只服務于一種類型的對象,如果要代理的方法很多沥寥,勢必要為每一種方法都進行代理碍舍,靜態(tài)代理在程序規(guī)模稍大時就無法勝任了。
2.如果接口增加一個方法邑雅,除了所有實現(xiàn)類需要實現(xiàn)這個方法外片橡,所有代理類也需要實現(xiàn)此方法。增加了代碼維護的復雜度淮野。
動態(tài)代理
動態(tài)代理類的源碼是在程序運行期間由JVM根據(jù)反射等機制 動態(tài)的生成锻全,所以不存在代理類的字節(jié)碼文件狂塘。代理類和委托類的關系是在程序運行時確定录煤。
-
優(yōu)點
動態(tài)代理與靜態(tài)代理相比較鳄厌,最大的好處是接口中聲明的所有方法都被轉移到調用處理器一個集中的方法中處理(InvocationHandler.invoke)。這樣妈踊,在接口方法數(shù)量比較多的時候了嚎,我們可以進行靈活處理,而不需要像靜態(tài)代理那樣每一個方法進行中轉廊营。
-
缺點
Proxy 已經設計得非常優(yōu)美歪泳,但是還是有一點點小小的遺憾之處,那就是它始終無法擺脫僅支持 interface 代理的桎梏露筒,因為它的設計注定了這個遺憾呐伞。回想一下那些動態(tài)生成的代理類的繼承關系圖慎式,它們已經注定有一個共同的父類叫 Proxy伶氢。Java 的繼承機制注定了這些動態(tài)代理類們無法實現(xiàn)對 class 的動態(tài)代理,原因是多繼承在 Java 中本質上就行不通瘪吏。
參考鏈接
https://blog.csdn.net/ikownyou/article/details/53081426