java靜態代理和動態代理的理解

概念:
靜態代理通常只代理一個類,動態代理是代理一個接口下的多個實現類。
靜態代理事先知道要代理的是什麼,而動態代理不知道要代理什麼東西,只有在運行時才知道。

AOP 編程就是基於動態代理實現的,比如著名的 Spring 框架、 Hibernate 框架等等都是動態代理的使用例子

先看看反射吧
1.如果我們需要對接口進行擴展則無須對源碼進行修改,只需對代理類進行擴展即可達到目的,所以反射機制提供了一種對Java擴展的方式,這種方式無侵入性。但是這種方式也不是十全十美,也有自己的瓶頸,首先被代理的只能是接口,這樣就限制了使用範圍,其次是性能問題,通過反射獲取對象的屬性的值要遠比直接通過屬性取值,最後反射的應用會模糊應用內實際要發生的事。
2.除了java自帶的反射機制外,另一種實現方式就是cglib,cglib完全避開了java自帶的反射機制帶來的問題,cglib不僅僅可以代理接口,同時可以給普通類進行代理,同時它採用fastclass機制爲代理類和被代理類各生成一個Class,這個Class會爲代理類或被代理類的方法分配一個index(int類型)。
這個index當做一個入參,FastClass就可以直接定位要調用的方法直接進行調用,這樣省去了反射調用,所以調用效率比JDK動態代理通過反射調用高

代理:爲某個對象提供一個代理,以控制對這個對象的訪問。 代理類和委託類有共同的父類或父接口,這樣在任何使用委託類對象的地方都可以用代理對象替代。代理類負責請求的預處理、過濾、將請求分派給委託類處理、以及委託類執行完請求後的後續處理。

暫時沒看懂

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章