這篇文章將為大家詳細(xì)講解有關(guān)Java實(shí)現(xiàn)動(dòng)態(tài)代理的方法有哪些,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供建湖網(wǎng)站建設(shè)、建湖做網(wǎng)站、建湖網(wǎng)站設(shè)計(jì)、建湖網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、建湖企業(yè)網(wǎng)站模板建站服務(wù),十載建湖做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
詳解Java動(dòng)態(tài)代理的實(shí)現(xiàn)及應(yīng)用
Java動(dòng)態(tài)代理其實(shí)寫日常業(yè)務(wù)代碼是不常用的,但在框架層一起RPC框架的客戶端是非常常見及重要的。spring的核心思想aop的底層原理實(shí)現(xiàn)就使用到了java的動(dòng)態(tài)代理技術(shù)。
使用代理可以實(shí)現(xiàn)對(duì)象的遠(yuǎn)程調(diào)用以及aop的實(shí)現(xiàn)。
java的動(dòng)態(tài)代理的實(shí)現(xiàn),主要依賴InvoctionHandler(接口)和Proxy(類)這兩個(gè)。
下面是一個(gè)例子
實(shí)現(xiàn)的代理的一般需要有個(gè)接口
package com.yasin.ProxyLearn; public interface IStudy { public void learn(); public String getKonwledge(); }
該接口的實(shí)現(xiàn)的類
package com.yasin.ProxyLearn; public class Study implements IStudy{ public void learn() { System.out.println("我要開始學(xué)習(xí)了!"); } public String getKonwledge() { return "Java真的強(qiáng)"; } }
代理類,該類需要實(shí)現(xiàn)InvacationHandler接口
package com.yasin.ProxyLearn; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class StudyProxy implements InvocationHandler{ //真實(shí)要被代理的對(duì)象 private Object study; public StudyProxy(Object study){ this.study=study; } /** * 當(dāng)被代理對(duì)象執(zhí)行自己的方法時(shí),便會(huì)執(zhí)行這個(gè)方法 */ public Object invoke(Object object, Method method, Object[] args) throws Throwable { Object obj=null; System.out.println("代理執(zhí)行前我可以執(zhí)行一些操作"); //執(zhí)行被代理對(duì)象的方法 obj = method.invoke(study, args); System.out.println("代理執(zhí)行后我還可以執(zhí)行一些操作"); return obj; } }
測(cè)試類
package com.yasin.JavaLearn; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.xml.DOMConfigurator; import com.yasin.ProxyLearn.IStudy; import com.yasin.ProxyLearn.Study; import com.yasin.ProxyLearn.StudyProxy; /** * Hello world! * */ public class App { public static void main(String[] args) { IStudy study = new Study(); InvocationHandler handler = new StudyProxy(study); IStudy proxyStudy =(IStudy)Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[] {IStudy.class}, handler); proxyStudy.learn(); System.out.println(proxyStudy.getKonwledge()); } }
關(guān)于Java實(shí)現(xiàn)動(dòng)態(tài)代理的方法有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。