-
動態代理實現步驟查看全部
-
jdk動態代理中的invactionhandler接口查看全部
-
jdk動態代理中的proxy動態代理類查看全部
-
@設計模式——代理模式——靜態代理的實現 1、聚合代理優于繼承代理。因為實現功能疊加的情況下,聚合代理通過相互代理可以實現功能重用,而繼承代理必須寫多個類來實現多功能疊加。 2、靜態代理只能代理一種類型的被代理類,換個類型的就不行了,這需要動態代理 靜態代理的兩種實現方式對比(繼承方式和聚合方式) 案例--代理類功能的疊加 1. 繼承的方式:如果使用繼承的方式來實現我們代理功能的疊加,我們的代理類會無限的膨脹下去。 2. 聚合的方式: 由于代理類和被代理類都實現了相同的接口,那么代理類的構造參數就可以傳入該相同的接口,這樣在后面功能疊加的時候就可以傳入其他功能的代理類,因為他們都實現了相同的父接口。從而達到功能疊加的作用。 eg: 先記錄日志再記錄時間 Car car = new Car(); CarTimeProxy ctp = new CarTimeProxy(car); CarLogProxy clp = new CarLogProxy(ctp); clp.move(); 先記錄時間再記錄日志 Car car = new Car(); CarLogProxy clp = new CarLogProxy(car); CarTimeProxy ctp = new CarTimeProxy(clp); ctp.move(); 聚合的方式比繼承的方式靈活很多,通過聚合的方式,代理之間也是可以相互傳遞的,相互組合。查看全部
-
@設計模式——代理模式——靜態代理的概念 一、靜態代理 1、靜態代理:代理和被代理對象在【代理之前】都是【確定】的。他們都實現【相同的接口或者繼承相同的抽象類】 2、代理實現方法: (1)繼承法:代理類直接【繼承】被代理類,實現其原有方法,并添加一些額外功能 (2)聚合方法:代理類實現【相同的功能接口:很重要,事項相同接口,不同代理也可以進行相互代理】,并在內聲明一個被代理類的對象(類似封裝),通過內部對象實現其原有方法,并添加額外功能查看全部
-
代理模式 1、概念:為其他對象提供一種代理,以控制對這個對象的訪問(例如火車站代售處)。代理對象起到中介作用,可去掉功能服務或增加額外的服務。 2、分類: a.遠程代理---為不同地理的對象提供局域網代表對象。(類似于客戶端和服務器端) b.虛擬代理---根據需要將資源消耗很大的對象進行延遲,真正需要的時候才進行創建。(網頁中圖片的加載,先用一張虛擬的圖片進行顯示,等圖片加載完成后再進行顯示) c.保護代理---控制用戶的訪問權限。(發帖功能) d.智能應用代理---提供對目標對象一些額外的服務。(火車站)查看全部
-
筆記啊查看全部
-
看的啊查看全部
-
概念:為其他對象提供一種代理以控制對這個對象的訪問。 代理對象起到中介作用,可以去掉功能服務或者增加額外服務。 靜態代理:代理和被代理對象在代理之前是確定的。他們都是實現相同的接口或者繼承相同的抽象類。有繼承和聚合兩種方式,聚合優于繼承,如果用繼承那么代理類會無限膨脹 動態代理:所謂的Dynamic Proxy是這樣一種class: 它是在運行時生成的class 該class需要實現一組interface(接口) 使用動態代理類時,必須實現InvocationHandler接口 動態代理實現步驟: 1、 創建一個實現接口InvocationHandler的類,它必須實現invoke方法 2、 創建被代理的類以及接口 3、 調用Proxy的靜態方法,創建一個代理類 newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h) 4、 通過代理調用方法 動態代理的應用:AOP編程(面向切面編程),在不改變原有類的方法基礎上,增加一些額外的業務邏輯。 JDK動態代理與CGLIB動態代理區別 JDK動態代理:1、只能代理實現了接口的類 2、沒有實現接口的類不能實現JDK的動態代理 CGLIB動態代理:1、針對類來實現代理的 2、對指定目標類產生一個子類,通過方法攔截技術攔截所有父類方法的調用查看全部
-
總結回顧: 1、代理概念、分類及應用場景 為其他對象設置總代理,以控制對這個對象的訪問; 代理對象起到了中介的作用,去掉了某些功能,或增加了些額外的服務。 四類: Remote Proxy,客戶端服務器的模式 Virtual Proxy,資源消耗很大,或復雜的對象,需要延遲,需要時創建, Protect Proxy, 保護和控制權限 Smart Reference Proxy,提供額外服務。 為什么只講智能引用代理? 使用得多:日志處理、權限管理、事務處理... 靜態代理(繼承、聚合) JDK動態代理實現日志處理的功能 模擬JDK動態代理實現:在代理類Proxy和被代理類RealSubject之間,加入了invocationHandler。 調用jar包中某個類的方法,不能改源碼,AOP面向切面,增加額外事務邏輯。查看全部
-
上一講到代理,內部的業務邏輯是硬編碼的,如何實現真正的動態代理,動態的指定業務邏輯呢? ①需要創建一個事務處理器,首先創建一個接口也就是InvocationHandler,為了模擬JDK,這里把接口的名字和JDK事務處理器名稱一樣,同樣寫一個方法叫做invoke(),用來表示對某個對象的某個方法進行業務處理,所以需要把某個對象以及對象的方法作為invoke()方法的參數傳遞進來,invoke(Object obj,Method method),方法作為參數使用到了java反射,需要把此包引入。這樣InvocationHandler接口就完成了。 ②創建事務處理實現類比如說時間代理TimerProxy,實現了InvocationHandler接口,這樣結構就成了 ——————TimerProxy implements InvocationHandler{ ————————-@override ————————-void invoke(Object obj,Method method){ ———————————//業務邏輯<br> —————————————method.invoke(目標對象,參數); ————————————//業務邏輯<br> ——————————} —————————} 需要將目標對象傳入,沒有參數可以不寫參數,創建代理對象的構造方法,初始化目標對象 ③在Proxy類的newProxyInstance()方法中,除了要把目標Class接口作為參數外,還需要把事務處理器InvocationHandler 傳進去,然后更改創建實例對象中硬編碼的部分用事務處理器方法替代即可。難點在于字符串的拼接。查看全部
-
完善動態代理實現:首先得到系統編譯器,通過編譯器得到文件管理者,然后獲取文件,然后編譯器執行編譯任務,完成編譯之后,將class文件加載到類加載器中,通過構造方法得到實例,然后調用newInstance()接收一個對象的實例。 (1)拿到編譯器 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); (2)文件管理者 StandardJavaFileManager fileMgr = Compiler.getStandardFileManager(null,null,null); (3)獲取文件 Iterable units = fileMgr.getJavaFileObjects(filename); (4)編譯任務 CompilationTask t =compiler.getTask(null,fileMgr,null,null,null,units); (5)load到內存 ClassLoader cl = ClassLoader.getSystemClassLoader(); Class c = cl.loadClass(”com.imooc.proxy.$Proxy0”); (6)通過代理對象的構造器構造實例 Constructor ctr = c.getConstructor(infce); ctr.newInstance(new Car());查看全部
-
JDK自從1.3版本開始,就引入了動態代理,JDK的動態代理用起來非常簡單,但是它有一個限制,就是使用動態代理的對象必須實現一個或多個接口 。如果想代理沒有實現接口的類可以使用CGLIB包。 CGLIB(Code Generation Library)是一個開源項目。是一個強大的,高性能,高質量的Code生成類庫,它可以在運行期擴展Java類與實現Java接口。Hibernate用它來實現PO(Persistent Object 持久化對象)字節碼的動態生成。 注意:CGLIB不能對“final”修飾的類進行代理。 相關代碼——(下): @CglibProxy.java public class CglibProxy implements MethodInterceptor { private Enhancer enhancer=new Enhancer(); public Object getProxy(Class cls){ //設置創建子類的類 enhancer.setSuperclass(cls); enhancer.setCallback(this); return enhancer.create(); } /** * 參數:object:攔截所有目標類方法的調用,method:目標方法的反射對象,args:方法的參數,methodproxy:代理類的實例。 */ public Object intercept(Object object, Method method, Object[] args, MethodProxy methodproxy) throws Throwable { syso("日志開始..."); methodproxy.invokeSuper(object, args); syso("日志結束..."); return null; } }查看全部
-
JDK動態代理 1. 目的:動態產生代理,實現對【不同類】,【不同方法】的代理 2. java動態代理類,位于java.lang.reflect包下,一般涉及兩個類: (1)Interface InvocationHandler:該接口中僅定義了一個方法public object invoke(Object obj,Method method,Object[] args):實際使用中,obj指被代理類的對象,method指被代理的方法,args為該方法參數數組。這個抽象方法在代理類中動態實現。實現該接口即為代理的事務處理器。 (2)Proxy:該類即為動態代理類: static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h):返回代理類的一個實例,返回后的代理類可以被當作代理類使用(可使用被代理類的在【接口中】聲明過的方法)。第一個參數loader為被代理類的加載器,通過被代理類.getClass().getClassLoader()得到 · 第二個參數interfaces為被代理類實現的所有接口,同樣通過getClass().getInterfaces()得到 · 第三個參數handler就是自己實現的InvocationHandler的實現類的對象 3. 動態代理實現: 1) 聲明一個代理h實現InvocationHandler接口,通過【構造方法接受被代理類】,并實現invoke方法,添加業務邏輯(實現原有功能并添加額外功能) 2) 在測試類中,通過共同實現接口的實例獲得代理對象,并實現方法,如Interface1 i = (Interface1)Proxy.newProxyInstance(classLoader,classInterfaces,h); 3) 通過動態代理對象m,代用其方法i.fun();查看全部
-
jdk動態代理中的proxy動態代理類查看全部
舉報
0/150
提交
取消