溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java怎么查看jvm中動(dòng)態(tài)代理class類內(nèi)容

發(fā)布時(shí)間:2021-07-02 16:16:58 來(lái)源:億速云 閱讀:445 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“java怎么查看jvm中動(dòng)態(tài)代理class類內(nèi)容”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

在看dubbo源碼時(shí),發(fā)現(xiàn)dubbo調(diào)用過(guò)程設(shè)計(jì)到了很多動(dòng)態(tài)代理類技術(shù),但是這些動(dòng)態(tài)代理類都是運(yùn)行在內(nèi)存中的,沒(méi)有生成class文件,不了解到這些動(dòng)態(tài)代理類的內(nèi)容,就不知道他的調(diào)用過(guò)程是什么?

下面例子中是我對(duì)mybatis框架的調(diào)試,我們都知道m(xù)ybatis框架操作數(shù)據(jù)庫(kù)需要寫mapper.xml和mapper.java接口,持久層實(shí)現(xiàn)類可直接注入mapper.java類并進(jìn)行調(diào)用方法操作數(shù)據(jù)庫(kù),mybatis它是如何將mapper.java接口類進(jìn)行包裝供調(diào)用的呢?

主要工具:jvm的HSDB工具

操作系統(tǒng):windows系統(tǒng)

jdk版本:jdk1.8

1、斷點(diǎn)

dubug模式下,代理對(duì)象上下斷點(diǎn),這一步主要是方便獲取代理類的類名,大家直接打印出來(lái)也可以。斷點(diǎn)操作是防止代理類會(huì)變。

System.out.println("***&&&&&&&&&&&"+userMapper.getClass().getName());

java怎么查看jvm中動(dòng)態(tài)代理class類內(nèi)容

2、查看進(jìn)程ID

jps命令查看當(dāng)前程序的進(jìn)程ID值,注意程序如果有重啟,進(jìn)程id是會(huì)變的。

那如果確定進(jìn)程id呢?很簡(jiǎn)單,在項(xiàng)目未啟動(dòng)時(shí),jps看下,項(xiàng)目啟動(dòng)后,jps看下,多了那個(gè)進(jìn)程id就是我們需要的id值了。

我當(dāng)前程序啟動(dòng)進(jìn)程是38916。

java怎么查看jvm中動(dòng)態(tài)代理class類內(nèi)容

3、啟動(dòng)jvm中HSDB工具

hsdb是jvm自帶的工具,所以前提要把jdk安裝好,環(huán)境配置好。

java -classpath "%JAVA_HOME%/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB

4、配置HSDB

點(diǎn)擊【File】-->【Attach to hotspot process】-->輸入進(jìn)程id-->【ok】

java怎么查看jvm中動(dòng)態(tài)代理class類內(nèi)容

java怎么查看jvm中動(dòng)態(tài)代理class類內(nèi)容

5、獲取代理對(duì)象類名

我斷點(diǎn)userMapper對(duì)應(yīng)代理類的類名是$Proxy18@4954。圖片中顯示的很明顯。

java怎么查看jvm中動(dòng)態(tài)代理class類內(nèi)容

6、根據(jù)代理類類名在JVM中查看class

點(diǎn)擊【Tools】-->【Class Browser】-->輸入代理類類名

這里userMapper對(duì)象顯示代理類類名是$Proxy18,下面查找出來(lái)一個(gè)。

java怎么查看jvm中動(dòng)態(tài)代理class類內(nèi)容

7、生成class

點(diǎn)擊查找出來(lái)的class,再點(diǎn)擊【Create .class File】,此操作會(huì)在本地生成一個(gè)class文件。

java怎么查看jvm中動(dòng)態(tài)代理class類內(nèi)容

8、class反編譯

默認(rèn)生成的class文件在c盤,我的目錄是在C:\Users\Lu\com\sun\proxy\$Proxy18.class,仔細(xì)看下,生成路徑它是根據(jù)包名生成相應(yīng)的目錄。

jd-gui.exe反編譯工具編譯不成功。

我是直接將class文件copy到idea工具,某個(gè)項(xiàng)目的target/class目錄下,讓idea工具反編譯??吹絪electByNumb方法了,說(shuō)明這個(gè)類正是我要找userMapper的代理類。

java怎么查看jvm中動(dòng)態(tài)代理class類內(nèi)容

通過(guò)這次反編譯結(jié)果,可以明白:

1、為什么Proxy.newProxyInstance生成代理類時(shí),要傳入InvocationHandler類,是如何調(diào)到invoke()方法的。因?yàn)榇韺?duì)象對(duì)方法的實(shí)現(xiàn)是直接調(diào)用handler.invoke方法的。

2、為什么mybatis寫的mapper.java接口類,可以直接注入并調(diào)用,因?yàn)閙ybatis對(duì)每個(gè)mapper.java接口類,生成了代理對(duì)象是實(shí)現(xiàn)了這個(gè)接口的。

“java怎么查看jvm中動(dòng)態(tài)代理class類內(nèi)容”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI