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

資訊專欄INFORMATION COLUMN

吃透動態代理,解密spring AOP源碼(三)

Coding01 / 1193人閱讀

摘要:對象什么時候被回收答可達性分析,當發現某個類不被引用,類會被回收類的生命周期與動態代理關系動態代理是沒有源文件,直接生成字節碼的,加載到上面的。

上節講到動態代理生成的類為$Proxy0,但是在我們項目里面卻不存在,實際我們是用了這個實現類調用了方法,想要知道這個問題,首先要理解類的完整生命周期.

類的完整生命周期

Java源文件:即我們在IDE里面寫的.java文件

Java字節碼:即編譯器編譯之后的.class文件(javac命令).備注:Java代碼為何能夠跨平臺,和Java字節碼技術是分不開的,這個字節碼在windows,在linux下都是可以運行的

class對象:工程啟動的時候classLoader類加載器會掃描這些字節碼并加載到classLoader上面生成class對象,有了類對象,便可以new實例了。(class對象保存在方法區元空間JDK1.8)

卸載:垃圾回收,關于回收機制,算法有興趣可以去了解。class對象什么時候被回收?答:可達性分析,當發現某個類不被引用,類會被回收

類的生命周期與動態代理關系

動態代理是沒有Java源文件,直接生成Java字節碼的,加載到JVM上面的。字節碼來源于內存,比如tomcat的熱加載就是從網絡傳輸過來的。

既然是直接生成的Java字節碼,是怎么生成的?從源碼開始分析,從Proxy.newProxyInstance方法開始看。

Class cl = getProxyClass0(loader, intfs);這行代碼生成了.class字節碼并且生成了class對象,然后拿這個類對象獲取構造函數,再newInstance,生成實例對象,是通過反射的機制。重點還是怎么生成.class字節碼。


接下來apply()方法往下看

生成了字節碼數組,從而生成了Java字節碼,defineClass0(loader, proxyName,proxyClassFile, 0, proxyClassFile.length)則是加載字節碼文件,此方法為native方法,C語言方法,操作系統類庫(C/C++/匯編)。

字節碼文件的結構是如何的呢?我們把class文件生成出來并在反編譯工具打開,這里就用到了源碼里面的方法了。生成.class文件的代碼如下:

public static void generateClass(String proxyName, Class[] paramArrayOfClass, Class clazz) throws IOException {
        byte[]  classFile=ProxyGenerator.generateProxyClass(
                proxyName, paramArrayOfClass);
        String path=clazz.getResource(".").getPath();
        System.out.println(path);
        FileOutputStream outputStream =null;
        outputStream = new FileOutputStream(path + proxyName + "p.class");
        outputStream.write(classFile);
        outputStream.flush();
        outputStream.close();
    }     

                           

在剛剛的動態代理測試類增加幾行代碼:

 public static void main(String[] args) throws IOException {
        // 代購公司C,負責代購所有產品
        DynamicProxyCompanyC proxy = new DynamicProxyCompanyC();
        // 日本有家A公司生產男性用品
        ManToolFactory dogToolFactory = new AManFactory();
        // 代購A公司的產品
        proxy.setFactory(dogToolFactory);
        // 創建A公司的代理對象
        ManToolFactory proxyObject = (ManToolFactory) proxy.getProxyInstance();
        // 代理對象完成代購男性用品
        proxyObject.saleManTool("D");
        System.out.println("--------------");
        // 日本有家B公司生產女性用品
        WomanToolFactory womanToolFactory = new BWomanFactory();
        // 代購B公司的產品
        proxy.setFactory(womanToolFactory);
        // 創建B公司的代理對象
        WomanToolFactory proxyObject1 = (WomanToolFactory) proxy.getProxyInstance();
        // 代理對象完成代購女性用品
        proxyObject1.saleWomanTool(1.8);
        //生成代理類的.class文件
        DynamicProxyCompanyC.generateClass(proxyObject1.getClass().getSimpleName(),
                womanToolFactory.getClass().getInterfaces(), womanToolFactory.getClass());
    }
    

根據打印出來的class文件路徑打開并在反編譯工具上打開

動態代理生成的類就是這個了,調用業務方法saleWomanTool實際上變成了這個h.invoke,而這個h是所有Proxy類里面含有的 protected InvocationHandler h;(源碼可見),在用Proxy創建代理實例的時候已經傳入過了。

所以調用方法saleWomanTool就有了前置增強和后置增強。到這里已經解開了動態代理的原理

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73693.html

相關文章

  • 吃透動態代理解密spring AOP源碼(四)

    摘要:值得一提的是由于采用動態創建子類的方式生成代理對象,所以不能對目標類中的方法進行代理。動態代理中生成的代理類是子類,調試的時候可以看到,打開源碼可看到實現了和也就實現方法。 前面講到了動態代理的底層原理,接下來我們來看一下aop的動態代理.Spring AOP使用了兩種代理機制:一種是基于JDK的動態代理,一種是基于CGLib的動態代理. ①JDK動態代理:使用JDK創建代理有一個限制...

    Codeing_ls 評論0 收藏0
  • 吃透動態代理解密spring AOP源碼(二)

    摘要:緊接著上節,為了解決靜態代理的問題,出現了動態代理,假設動態代理是一個代購公司,私有變量為動態生成的具體的真實對象,可代購對應的產品。這個注釋是說提供個一個靜態方法來創建代理類和代理實例,它也是所有由此方法創建的代理類的父類。 緊接著上節,為了解決靜態代理的問題,出現了動態代理, 假設動態代理是一個代購公司,私有變量Object factory為動態生成的具體的真實對象,可代購對應的產...

    tianyu 評論0 收藏0
  • Spring AOP就是這么簡單啦

    摘要:是一種特殊的增強切面切面由切點和增強通知組成,它既包括了橫切邏輯的定義也包括了連接點的定義。實際上,一個的實現被拆分到多個類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因為我們要 前言 只有光頭才能變強 上一篇已經講解了Spring IOC知識點一網打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經寫過一篇關于AOP的文章了,那篇把比較重要的知...

    Jacendfeng 評論0 收藏0
  • 仿照 Spring 實現簡單的 IOC 和 AOP - 下篇

    摘要:在上文中,我實現了一個很簡單的和容器。比如,我們所熟悉的就是在這里將切面邏輯織入相關中的。初始化的工作算是結束了,此時處于就緒狀態,等待外部程序的調用。其中動態代理只能代理實現了接口的對象,而動態代理則無此限制。 1. 背景 本文承接上文,來繼續說說 IOC 和 AOP 的仿寫。在上文中,我實現了一個很簡單的 IOC 和 AOP 容器。上文實現的 IOC 和 AOP 功能很單一,且 I...

    AlexTuan 評論0 收藏0
  • 源碼入手,一文帶你讀懂Spring AOP面向切面編程

    摘要:,,面向切面編程。,切點,切面匹配連接點的點,一般與切點表達式相關,就是切面如何切點。例子中,注解就是切點表達式,匹配對應的連接點,通知,指在切面的某個特定的連接點上執行的動作。,織入,將作用在的過程。因為源碼都是英文寫的。 之前《零基礎帶你看Spring源碼——IOC控制反轉》詳細講了Spring容器的初始化和加載的原理,后面《你真的完全了解Java動態代理嗎?看這篇就夠了》介紹了下...

    wawor4827 評論0 收藏0

發表評論

0條評論

Coding01

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<