国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

動(dòng)態(tài)代理模式實(shí)現(xiàn)原理

songjz / 1929人閱讀

摘要:代理模式概念代理模式分為兩種,一種是靜態(tài)代理模式,一種是動(dòng)態(tài)代理模式。面向切面的編程也是使用動(dòng)態(tài)代理模式來實(shí)現(xiàn)的。

1.代理模式概念
代理模式分為兩種,一種是靜態(tài)代理模式,一種是動(dòng)態(tài)代理模式。
靜態(tài)代理模式:在程序運(yùn)行之前需要寫好代理類
動(dòng)態(tài)代理模式:在程序運(yùn)行期間動(dòng)態(tài)生成代理類
2.動(dòng)態(tài)代理的實(shí)現(xiàn)
動(dòng)態(tài)代理實(shí)現(xiàn)的步驟:
(1)寫一個(gè)代理類SubjectHandler實(shí)現(xiàn)InvocationHandler接口,重寫invoke方法,
   通過構(gòu)造函數(shù)把代理的對(duì)象realSubject傳入到此處理類中,
   在invoke方法中增加method.invoke(realSubject, args);
public interface Subject
{
    public void rent();
}
public class RealSubject implements Subject
{
    @Override
    public void rent()
    {
        System.out.println("I want to rent my house");
    }
}
public class SubjectHandler implements InvocationHandler
{
    private Subject subject;
    public SubjectHandler(Subject subject)
    {
        this.subject = subject;
    }
    
    @Override
    public Object invoke(Object object, Method method, Object[] args) throws Throwable
    {
        System.out.println("before rent house");
        method.invoke(subject, args);
        System.out.println("after rent house");
        return null;
    }
}
   
(2)在調(diào)用方法中增加代碼即可完成調(diào)用
public class Client
{
    public static void main(String[] args)
    {
        RealSubject realSubject = new RealSubject();
        //生成代理類的對(duì)象
        Subject subject = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), new SubjectHandler(realSubject));
        subject.rent(); //調(diào)用代理類的方法
    }
}
//第一個(gè)參數(shù)為realSubject的classloader
//第二個(gè)參數(shù)為realSubject的所有接口
//第三個(gè)參數(shù)為處理類

上面的內(nèi)容是幾年前在網(wǎng)上看到的,具體出自那篇文章忘記了,動(dòng)態(tài)代理的處理過程大體如上。

3.動(dòng)態(tài)代理的實(shí)現(xiàn)過程

通過看馬士兵的設(shè)計(jì)模式中的代理模式教程,對(duì)代理模式的內(nèi)部實(shí)現(xiàn)原理有了更清楚的認(rèn)識(shí),下面的圖片是自己總結(jié)的代理類的產(chǎn)生過程:

下面的代碼來自馬士兵關(guān)于動(dòng)態(tài)代理講解的源碼

        //模擬代理類的實(shí)現(xiàn)代碼
        //把出來的內(nèi)容寫入文件中
        String fileName = 
            "d:/src/com/proxy/$Proxy1.java";
        File f = new File(fileName);
        FileWriter fw = new FileWriter(f);
        fw.write(src);
        fw.flush();
        fw.close();
        
        //編譯文件,
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
        Iterable units = fileMgr.getJavaFileObjects(fileName);
        CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
        t.call();
        fileMgr.close();
        
        //把class文件加載到內(nèi)存中,通過構(gòu)造方法生成代理的對(duì)象
        URL[] urls = new URL[] {new URL("file:/" + "d:/src/")};
        URLClassLoader ul = new URLClassLoader(urls);
        Class c = ul.loadClass("com.proxy.$Proxy1");
        System.out.println(c);
        
        Constructor ctr = c.getConstructor(InvocationHandler.class);
        Object m = ctr.newInstance(h);
        return m;

在生成的代理類中對(duì)應(yīng)的方法如下

private static Method m0;
public final void rent() {
        try {
            super.h.invoke(this, m0, null);
            return;
        } catch (Error e) {
        } catch (Throwable throwable) {
            throw new UndeclaredThrowableException(throwable);
        }
}
       

從上面我們可以看出,生成的代理對(duì)象subject 調(diào)用rent方法,其實(shí)是調(diào)用的上面代理類中生成的rent方法,在rent方法中調(diào)用了SubjectHandler 的invoke方法,通過上面的流程梳理,對(duì)于代理模式理解就更容易一些。

spring aop面向切面的編程也是使用動(dòng)態(tài)代理模式來實(shí)現(xiàn)的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67265.html

相關(guān)文章

  • Java動(dòng)態(tài)代理 jdk和cglib的實(shí)現(xiàn)比較

    摘要:與靜態(tài)代理對(duì)比,動(dòng)態(tài)代理是在動(dòng)態(tài)生成代理類,由代理類完成對(duì)具體方法的封裝,實(shí)現(xiàn)的功能。本文將分析中兩種動(dòng)態(tài)代理的實(shí)現(xiàn)方式,和,比較它們的異同。那如何動(dòng)態(tài)編譯呢你可以使用,這是一個(gè)封裝了的庫,幫助你方便地實(shí)現(xiàn)動(dòng)態(tài)編譯源代碼。 發(fā)現(xiàn)Java面試很喜歡問Spring AOP怎么實(shí)現(xiàn)的之類的問題,所以寫一篇文章來整理一下。關(guān)于AOP和代理模式的概念這里并不做贅述,而是直奔主題,即AOP的實(shí)現(xiàn)方...

    h9911 評(píng)論0 收藏0
  • java動(dòng)態(tài)代理及RPC框架介紹

    摘要:這種語法,在中被稱為動(dòng)態(tài)代理。在動(dòng)態(tài)代理機(jī)制中,這個(gè)角色只能是接口。動(dòng)態(tài)代理就是實(shí)現(xiàn)的技術(shù)之一。 所謂動(dòng)態(tài)代理,指的是語言提供的一種語法,能夠?qū)?duì)對(duì)象中不同方法的調(diào)用重定向到一個(gè)統(tǒng)一的處理函數(shù)中來。python重寫__getattr__函數(shù)能夠做到這一點(diǎn),就連世界上最好的語言也提供稱為魔術(shù)方法的__call。這種語法除了能更好的實(shí)現(xiàn)動(dòng)態(tài)代理外,還是RPC框架實(shí)現(xiàn)原理的一部分。 動(dòng)態(tài)代理...

    2shou 評(píng)論0 收藏0
  • JAVA代理模式的理解和應(yīng)用

    摘要:代理模式代理模式通俗一點(diǎn)的解釋就是在操作一個(gè)對(duì)象和對(duì)象中的方法時(shí),不是直接操作這個(gè)對(duì)象,還是通過一個(gè)代理對(duì)象來操作這個(gè)實(shí)際的目標(biāo)對(duì)象。 代理模式: 代理模式通俗一點(diǎn)的解釋就是在操作一個(gè)對(duì)象和對(duì)象中的方法時(shí),不是直接操作這個(gè)對(duì)象,還是通過一個(gè)代理對(duì)象來操作這個(gè)實(shí)際的目標(biāo)對(duì)象。應(yīng)用場景一般是需要在執(zhí)行某個(gè)已經(jīng)寫好的方法前后再添加一段邏輯,比如執(zhí)行方法前打印日志,或者在執(zhí)行方法之前和之后打時(shí)...

    CatalpaFlat 評(píng)論0 收藏0
  • 【干貨】JDK動(dòng)態(tài)代理實(shí)現(xiàn)原理以及如何手寫一個(gè)JDK動(dòng)態(tài)代理

    摘要:代理模式從類型上來說,可以分為靜態(tài)代理和動(dòng)態(tài)代理兩種類型。然而今天的重點(diǎn)是我們都知道牛逼轟轟的的實(shí)現(xiàn)的一種方式是使用的動(dòng)態(tài)代理另一種是,大部分人也會(huì)用的動(dòng)態(tài)代理,不過沒有研究過的動(dòng)態(tài)代理到底是怎么實(shí)現(xiàn)的。 動(dòng)態(tài)代理 代理模式是設(shè)計(jì)模式中非常重要的一種類型,而設(shè)計(jì)模式又是編程中非常重要的知識(shí)點(diǎn),特別是在業(yè)務(wù)系統(tǒng)的重構(gòu)中,更是有舉足輕重的地位。代理模式從類型上來說,可以分為靜態(tài)代理和動(dòng)態(tài)代...

    forsigner 評(píng)論0 收藏0
  • Java三種代理模式:靜態(tài)代理動(dòng)態(tài)代理和cglib代理

    摘要:動(dòng)態(tài)代理又被稱為代理或接口代理。靜態(tài)代理在編譯時(shí)產(chǎn)生字節(jié)碼文件,可以直接使用,效率高。代理無需實(shí)現(xiàn)接口,通過生成類字節(jié)碼實(shí)現(xiàn)代理,比反射稍快,不存在性能問題,但會(huì)繼承目標(biāo)對(duì)象,需要重寫方法,所以目標(biāo)對(duì)象不能為類。 一、代理模式介紹 代理模式是一種設(shè)計(jì)模式,提供了對(duì)目標(biāo)對(duì)象額外的訪問方式,即通過代理對(duì)象訪問目標(biāo)對(duì)象,這樣可以在不修改原目標(biāo)對(duì)象的前提下,提供額外的功能操作,擴(kuò)展目標(biāo)對(duì)象的功...

    Kaede 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

songjz

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<