本篇內(nèi)容介紹了“java怎么查看jvm中動態(tài)代理class類內(nèi)容”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)建站從2013年開始,先為隨縣等服務(wù)建站,隨縣等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為隨縣企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
在看dubbo源碼時,發(fā)現(xiàn)dubbo調(diào)用過程設(shè)計到了很多動態(tài)代理類技術(shù),但是這些動態(tài)代理類都是運行在內(nèi)存中的,沒有生成class文件,不了解到這些動態(tài)代理類的內(nèi)容,就不知道他的調(diào)用過程是什么?
下面例子中是我對mybatis框架的調(diào)試,我們都知道m(xù)ybatis框架操作數(shù)據(jù)庫需要寫mapper.xml和mapper.java接口,持久層實現(xiàn)類可直接注入mapper.java類并進(jìn)行調(diào)用方法操作數(shù)據(jù)庫,mybatis它是如何將mapper.java接口類進(jìn)行包裝供調(diào)用的呢?
主要工具:jvm的HSDB工具
操作系統(tǒng):windows系統(tǒng)
jdk版本:jdk1.8
dubug模式下,代理對象上下斷點,這一步主要是方便獲取代理類的類名,大家直接打印出來也可以。斷點操作是防止代理類會變。
System.out.println("***&&&&&&&&&&&"+userMapper.getClass().getName());
jps命令查看當(dāng)前程序的進(jìn)程ID值,注意程序如果有重啟,進(jìn)程id是會變的。
那如果確定進(jìn)程id呢?很簡單,在項目未啟動時,jps看下,項目啟動后,jps看下,多了那個進(jìn)程id就是我們需要的id值了。
我當(dāng)前程序啟動進(jìn)程是38916。
hsdb是jvm自帶的工具,所以前提要把jdk安裝好,環(huán)境配置好。
java -classpath "%JAVA_HOME%/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB
點擊【File】-->【Attach to hotspot process】-->輸入進(jìn)程id-->【ok】
我斷點userMapper對應(yīng)代理類的類名是$Proxy18@4954。圖片中顯示的很明顯。
點擊【Tools】-->【Class Browser】-->輸入代理類類名
這里userMapper對象顯示代理類類名是$Proxy18,下面查找出來一個。
點擊查找出來的class,再點擊【Create .class File】,此操作會在本地生成一個class文件。
默認(rèn)生成的class文件在c盤,我的目錄是在C:\Users\Lu\com\sun\proxy\$Proxy18.class,仔細(xì)看下,生成路徑它是根據(jù)包名生成相應(yīng)的目錄。
jd-gui.exe反編譯工具編譯不成功。
我是直接將class文件copy到idea工具,某個項目的target/class目錄下,讓idea工具反編譯??吹絪electByNumb方法了,說明這個類正是我要找userMapper的代理類。
通過這次反編譯結(jié)果,可以明白:
1、為什么Proxy.newProxyInstance生成代理類時,要傳入InvocationHandler類,是如何調(diào)到invoke()方法的。因為代理對象對方法的實現(xiàn)是直接調(diào)用handler.invoke方法的。
2、為什么mybatis寫的mapper.java接口類,可以直接注入并調(diào)用,因為mybatis對每個mapper.java接口類,生成了代理對象是實現(xiàn)了這個接口的。
“java怎么查看jvm中動態(tài)代理class類內(nèi)容”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!