日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

如何使用Proxy模式及Java内建的动态代理机制

發(fā)布時(shí)間:2024/4/17 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用Proxy模式及Java内建的动态代理机制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://zhangjunhd.blog.51cto.com/113473/69996 1.Proxy模式 代理模式支持將某些操作從實(shí)際的對象中分離出來,通過它的代理類提供處理。這樣便于修改和管理這些特定的操作。 下面示例一個(gè)代理模式的實(shí)現(xiàn)。 <!--[if !vml]-->
<!--[endif]--> <<interface>>Subject.java
package com.zj.proxy; publicinterface Subject { ??? void operation1(); ??? ??? void operation2(String arg); }
現(xiàn)實(shí)類RealSubject.java
package com.zj.proxy; publicclass RealSubject implements Subject { ??? publicvoid operation1() { ?????? System.out.println("Realer do operation1"); ??? } ??? publicvoid operation2(String arg) { ?????? System.out.println("Realer do operation2 with " + arg); ??? } }
代理類ProxySubject.java
package com.zj.proxy; publicclass ProxySubject implements Subject { ??? private Subject proxied;// 被代理對象 ??? public ProxySubject(Subject proxied) { ?????? this.proxied = proxied; ??? } ??? publicvoid operation1() { ?????? System.out.println("Proxyer do operation1"); ?????? proxied.operation1(); ??? } ??? publicvoid operation2(String arg) { ?????? System.out.println("Proxyer do operation2 with " + arg); ?????? proxied.operation2(arg); ??? } }
測試類SimpleProxyDemo.java
package com.zj.proxy.client; import com.zj.proxy.Subject; import com.zj.proxy.RealSubject; import com.zj.proxy.ProxySubject; publicclass SimpleProxyDemo { ??? publicstaticvoid consumer(Subject subject) { ?????? subject.operation1(); ?????? subject.operation2("ZJ"); ??? } ??? publicstaticvoid main(String[] args) { ?????? RealSubject real = new RealSubject(); ?????? System.out.println("===Without Proxy==="); ?????? consumer(real); ?????? System.out.println("===Use Proxy==="); ?????? consumer(new ProxySubject(real)); ??? } }
結(jié)果: ===Without Proxy=== Realer do operation1 Realer do operation2 with ZJ ===Use Proxy=== Proxyer do operation1 Realer do operation1 Proxyer do operation2 with ZJ Realer do operation2 with ZJ 2.使用Java的動(dòng)態(tài)代理機(jī)制 設(shè)計(jì)一個(gè)類用于實(shí)現(xiàn)InvocationHandle接口,InvocationHandler 是代理實(shí)例的調(diào)用處理程序?qū)崿F(xiàn)的接口。 每個(gè)代理實(shí)例都具有一個(gè)關(guān)聯(lián)的調(diào)用處理程序。對代理實(shí)例調(diào)用方法時(shí),將對方法調(diào)用進(jìn)行編碼并將其指派到它的調(diào)用處理程序的 invoke 方法。 <<interface>>InvocationHandle.java
package java.lang.reflect; publicinterface InvocationHandler { ??? public Object invoke(Object proxy, Method method, Object[] args) ??? throws Throwable; }
對應(yīng)invoke參數(shù): [1]proxy - 在其上調(diào)用方法的代理實(shí)例; [2]method - 對應(yīng)于在代理實(shí)例上調(diào)用的接口方法的 Method 實(shí)例; [3]args - 包含傳入代理實(shí)例上方法調(diào)用的參數(shù)值的對象數(shù)組,如果接口方法不使用參數(shù),則為 null。 現(xiàn)在設(shè)計(jì)一個(gè)類實(shí)現(xiàn)該接口,并提供代理實(shí)例。 DynamicProxyHandler.java
package com.zj.proxy.dynamic; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; publicclass DynamicProxyHandler implements InvocationHandler { ??? private Object proxied; ??? public DynamicProxyHandler(Object proxied) { ?????? this.proxied = proxied; ??? } ??? public Object invoke(Object proxy, Method method, Object[] args) ?????????? throws Throwable { ?????? System.out.println("**** proxy: ****\n" + proxy.getClass() ????????????? + "\nmethod: " + method + "\nargs: " + args); ?????? if (args != null) ?????????? for (Object arg : args) ????????????? System.out.println("? " + arg); ?????? return method.invoke(proxied, args); ??? } }
這里的private Object proxied;即代理實(shí)例,也即上文代理模式中介紹的RealSubject對象。 在invoke()方法中,我們會(huì)打印它的所有參數(shù),并調(diào)用當(dāng)前代理的方法。 測試類DynamicProxyDemo.java
package com.zj.proxy.client; import java.lang.reflect.Proxy; import com.zj.proxy.Subject; import com.zj.proxy.RealSubject; import com.zj.proxy.dynamic.DynamicProxyHandler; publicclass DynamicProxyDemo { ??? publicstaticvoid consumer(Subject subject) { ?????? subject.operation1(); ?????? subject.operation2("ZJ"); ??? } ??? ??? publicstaticvoid main(String[] args) { ??? ??? RealSubject real = new RealSubject(); ?????? System.out.println("===Without Proxy==="); ?????? consumer(real); ?????? System.out.println("===Use Proxy==="); ?????? Subject proxy = (Subject) Proxy.newProxyInstance(Subject.class ????????????? .getClassLoader(), new Class[] { Subject.class }, ????????????? new DynamicProxyHandler(real)); ?????? consumer(proxy); ??? } }
這里通過Proxy的靜態(tài)方法newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h)生成代理類,并傳遞與其關(guān)聯(lián)的調(diào)用處理程序new DynamicProxyHandler(real)。 對于newProxyInstance()的參數(shù): [1]loader - 定義代理類的類加載器 ; [2]interfaces - 代理類要實(shí)現(xiàn)的接口列表 ; [3]h - 指派方法調(diào)用的調(diào)用處理程序 。 測試結(jié)果: ===Without Proxy=== Realer do operation1 Realer do operation2 with ZJ ===Use Proxy=== **** proxy: **** class $Proxy0 method: public abstract void com.zj.proxy.Subject.operation1() args: null Realer do operation1 **** proxy: **** class $Proxy0 method: public abstract void com.zj.proxy.Subject.operation2(java.lang.String) args: [Ljava.lang.Object;@de6f34 ? ZJ Realer do operation2 with ZJ 從結(jié)果可以發(fā)現(xiàn),通過代理可以得到當(dāng)前被調(diào)用的方法,及其參數(shù)。代理過程可以基于此進(jìn)行邏輯處理,測試程序只是簡單的打印這些相關(guān)信息。

本文出自 “子 孑” 博客,請務(wù)必保留此出處http://zhangjunhd.blog.51cto.com/113473/69996

總結(jié)

以上是生活随笔為你收集整理的如何使用Proxy模式及Java内建的动态代理机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。