亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種針對目標(biāo)方法的監(jiān)控、熱切入方法及裝置制造方法

文檔序號:6634118閱讀:141來源:國知局
一種針對目標(biāo)方法的監(jiān)控、熱切入方法及裝置制造方法
【專利摘要】一種針對目標(biāo)方法的監(jiān)控、熱切入方法及裝置。本發(fā)明公開了一種針對目標(biāo)方法的監(jiān)控方法,用于解決集成測試的效率較低、測試時間過長的技術(shù)問題。所述方法包括:在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼;通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果;通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。本發(fā)明還公開了一種熱切入方法,及相應(yīng)的裝置。
【專利說明】一種針對目標(biāo)方法的監(jiān)控、熱切入方法及裝置

【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機(jī)【技術(shù)領(lǐng)域】,特別涉及一種針對目標(biāo)對象的監(jiān)控、熱切入方法及
>J-U ρ?α裝直。

【背景技術(shù)】
[0002]在基于Web (網(wǎng)頁)應(yīng)用的項目開發(fā)過程中,各個模塊之間的集成測試通常效率都很低。開發(fā)人員要測試自己所屬模塊的代碼時,通常都要從前臺界面發(fā)起端到端的業(yè)務(wù),才能觸發(fā)到自己的代碼。而在集成測試過程中,各個模塊都可能導(dǎo)致端到端的業(yè)務(wù)無法正常完成,這樣導(dǎo)致開發(fā)人員總是要等待其他模塊的修復(fù),在業(yè)務(wù)通暢后才能測試到自己的代碼。而且端到端業(yè)務(wù)的流程復(fù)雜,耗時很長,在集成測試環(huán)境上調(diào)測自己的代碼十分困難。
[0003]例如,要開發(fā)一個購票軟件,整個流程可能包括了選票、訂票、付款等過程。那么,如果需要對付款模塊對應(yīng)的代碼進(jìn)行測試,就必須等到選票、訂票等過程均完成后才能測試,在這個過程中,如果前面的選票、訂票等任意一個過程中間出現(xiàn)故障,流程無法正常進(jìn)行,那也就無法對付款模塊對應(yīng)的代碼進(jìn)行測試,只有等前面故障都排除之后才能再進(jìn)行測試??梢?,現(xiàn)在的測試方式效率低下,而且耗時過長。


【發(fā)明內(nèi)容】

[0004]本發(fā)明實施例提供一種針對目標(biāo)對象的監(jiān)控、熱切入方法及裝置,用于解決集成測試的效率較低、測試時間過長的技術(shù)問題。
[0005]本發(fā)明的第一方面,提供一種針對目標(biāo)方法的監(jiān)控方法,包括:
[0006]在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼;
[0007]通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果;
[0008]通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。
[0009]結(jié)合第一方面,在第一方面的第一種可能的實現(xiàn)方式中,啟動代理進(jìn)程,包括:通過虛擬機(jī)VirtualMachine類的附加attach方法啟動所述代理進(jìn)程。
[0010]結(jié)合第一方面或第一方面的第一種可能的實現(xiàn)方式,在第一方面的第二種可能的實現(xiàn)方式中,在通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼之前,還包括:
[0011]通過所述代理進(jìn)程,根據(jù)執(zhí)行所述代理進(jìn)程的入口方法的儀器Instrumentat1n對象,獲取所述調(diào)用進(jìn)程中所有已加載的類的信息;
[0012]通過所述代理進(jìn)程,根據(jù)所述調(diào)用進(jìn)程的監(jiān)控對象,從獲取的所有已加載的類的信息中確定所述目標(biāo)類,進(jìn)而確定所述目標(biāo)方法。
[0013]結(jié)合第一方面或第一方面的第一種可能的實現(xiàn)方式或第二種可能的實現(xiàn)方式,在第一方面的第三種可能的實現(xiàn)方式中,通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼,包括:
[0014]通過所述代理進(jìn)程,使用開源包Javassist在所述目標(biāo)方法所對應(yīng)的所述第一代碼中插入所述切面代碼,得到所述目標(biāo)方法對應(yīng)的第二代碼;
[0015]通過所述代理進(jìn)程對所述第二代碼進(jìn)行編譯,得到所述第二類字節(jié)碼。
[0016]結(jié)合第一方面的第三種可能的實現(xiàn)方式,在第一方面的第四種可能的實現(xiàn)方式中,通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,包括:
[0017]通過所述代理進(jìn)程中的Instrumentat1n對象的一種方法RefineClass方法,將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程。
[0018]本發(fā)明的第二方面,提供一種熱切入方法,包括:
[0019]在通過調(diào)用進(jìn)程對目標(biāo)方法進(jìn)行攔截時,執(zhí)行所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;其中,所述第二類字節(jié)碼為對所述目標(biāo)方法對應(yīng)的第二代碼進(jìn)行編譯得到的,所述第二代碼為在所述目標(biāo)方法原對應(yīng)的第一代碼中插入切面代碼后得到的;
[0020]在執(zhí)行所述第二類字節(jié)碼的過程中,通過所述切面代碼記錄本次調(diào)用信息,并將所述調(diào)用信息作為歷史記錄進(jìn)行保存。
[0021]結(jié)合第二方面,在第二方面的第一種可能的實現(xiàn)方式中,在將所述調(diào)用信息作為歷史記錄進(jìn)行保存之后,還包括:
[0022]從保存的歷史記錄中選擇第一歷史記錄,并確定重執(zhí)行所述第一歷史記錄對應(yīng)的攔截任務(wù);
[0023]對所述第一歷史記錄進(jìn)行反序列化,獲得所述第一歷史記錄對應(yīng)的目標(biāo)對象以及入?yún)ⅲ?br> [0024]根據(jù)一種編程語言Java反射機(jī)制,對所述目標(biāo)對象執(zhí)行的第一目標(biāo)方法進(jìn)行攔截,并向所述第一目標(biāo)方法傳入所述入?yún)ⅰ?br> [0025]本發(fā)明的第三方面,提供一種針對目標(biāo)方法的監(jiān)控裝置,包括:
[0026]啟動模塊,用于在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼;
[0027]插入模塊,用于通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果;
[0028]替換模塊,用于通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。
[0029]結(jié)合第三方面,在第三方面的第一種可能的實現(xiàn)方式中,所述啟動模塊用于啟動代理進(jìn)程,具體為:通過虛擬機(jī)VirtualMachine類的附加attach方法啟動所述代理進(jìn)程。
[0030]結(jié)合第三方面或第三方面的第一種可能的實現(xiàn)方式,在第三方面的第二種可能的實現(xiàn)方式中,所述裝置還包括獲取模塊和確定模塊;
[0031]所述獲取模塊用于:在所述插入模塊通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼之前,通過所述代理進(jìn)程,根據(jù)執(zhí)行所述代理進(jìn)程的入口方法的儀器Instrumentat1n對象,獲取所述調(diào)用進(jìn)程中所有已加載的類的信息;
[0032]所述確定模塊用于:通過所述代理進(jìn)程,根據(jù)所述調(diào)用進(jìn)程的監(jiān)控對象,從獲取的所有已加載的類的信息中確定所述目標(biāo)類,進(jìn)而確定所述目標(biāo)方法。
[0033]結(jié)合第三方面或第三方面的第一種可能的實現(xiàn)方式或第二種可能的實現(xiàn)方式,在第三方面的第三種可能的實現(xiàn)方式中,所述插入模塊具體用于:
[0034]通過所述代理進(jìn)程,使用開源包Javassist在所述目標(biāo)方法所對應(yīng)的所述第一代碼中插入所述切面代碼,得到所述目標(biāo)方法對應(yīng)的第二代碼;
[0035]通過所述代理進(jìn)程對所述第二代碼進(jìn)行編譯,得到所述第二類字節(jié)碼。
[0036]結(jié)合第三方面的第三種可能的實現(xiàn)方式,在第三方面的第四種可能的實現(xiàn)方式中,所述替換模塊用于通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,具體為:
[0037]通過所述代理進(jìn)程中的Instrumentat1n對象的一種方法RefineClass方法,將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程。
[0038]本發(fā)明的第四方面,提供一種熱切入裝置,包括:
[0039]執(zhí)行模塊,用于在通過調(diào)用進(jìn)程對目標(biāo)方法進(jìn)行攔截時,執(zhí)行所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;其中,所述第二類字節(jié)碼為對所述目標(biāo)方法對應(yīng)的第二代碼進(jìn)行編譯得到的,所述第二代碼為在所述目標(biāo)方法原對應(yīng)的第一代碼中插入切面代碼后得到的;
[0040]記錄模塊,用于在執(zhí)行所述第二類字節(jié)碼的過程中,通過所述切面代碼記錄本次調(diào)用信息,并將所述調(diào)用信息作為歷史記錄進(jìn)行保存。
[0041]結(jié)合第四方面,在第四方面的第一種可能的實現(xiàn)方式中,所述裝置還包括選擇模塊、獲取模塊和攔截模塊;
[0042]所述選擇模塊用于從保存的歷史記錄中選擇第一歷史記錄,并確定重執(zhí)行所述第一歷史記錄對應(yīng)的攔截任務(wù);
[0043]所述獲取模塊用于對所述第一歷史記錄進(jìn)行反序列化,獲得所述第一歷史記錄對應(yīng)的目標(biāo)對象以及入?yún)ⅲ?br> [0044]所述攔截模塊用于根據(jù)一種編程語言Java反射機(jī)制,對所述目標(biāo)對象執(zhí)行的第一目標(biāo)方法進(jìn)行攔截,并向所述第一目標(biāo)方法傳入所述入?yún)ⅰ?br> [0045]本發(fā)明的第五方面,提供一種針對目標(biāo)方法的監(jiān)控裝置,包括連接到同一總線的存儲器和處理器;
[0046]所述存儲器,用于存儲指令;
[0047]所述處理器,用于執(zhí)行所述指令,在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼;通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果;通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。
[0048]結(jié)合第五方面,在第五方面的第一種可能的實現(xiàn)方式中,所述處理器用于啟動代理進(jìn)程,具體為:通過虛擬機(jī)VirtualMachine類的附加attach方法啟動所述代理進(jìn)程。
[0049]結(jié)合第五方面或第五方面的第一種可能的實現(xiàn)方式,在第五方面的第二種可能的實現(xiàn)方式中,所述處理器還用于:
[0050]執(zhí)行所述指令,在通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼之前,通過所述代理進(jìn)程,根據(jù)執(zhí)行所述代理進(jìn)程的入口方法的儀器Instrumentat1n對象,獲取所述調(diào)用進(jìn)程中所有已加載的類的信息;
[0051]通過所述代理進(jìn)程,根據(jù)所述調(diào)用進(jìn)程的監(jiān)控對象,從獲取的所有已加載的類的信息中確定所述目標(biāo)類,進(jìn)而確定所述目標(biāo)方法。
[0052]結(jié)合第五方面或第五方面的第一種可能的實現(xiàn)方式或第二種可能的實現(xiàn)方式,在第五方面的第三種可能的實現(xiàn)方式中,所述處理器用于通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼,具體為:
[0053]通過所述代理進(jìn)程,使用開源包Javassist在所述目標(biāo)方法所對應(yīng)的所述第一代碼中插入所述切面代碼,得到所述目標(biāo)方法對應(yīng)的第二代碼;
[0054]通過所述代理進(jìn)程對所述第二代碼進(jìn)行編譯,得到所述第二類字節(jié)碼。
[0055]結(jié)合第五方面的第三種可能的實現(xiàn)方式,在第五方面的第四種可能的實現(xiàn)方式中,所述處理器用于通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,具體為:
[0056]通過所述代理進(jìn)程中的Instrumentat1n對象的一種方法RefineClass方法,將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程。
[0057]本發(fā)明的第六方面,提供一種熱切入裝置,包括連接到同一總線的存儲器和處理器;
[0058]所述存儲器,用于存儲指令;
[0059]所述處理器,用于執(zhí)行所述指令,在通過調(diào)用進(jìn)程對目標(biāo)方法進(jìn)行攔截時,執(zhí)行所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;其中,所述第二類字節(jié)碼為對所述目標(biāo)方法對應(yīng)的第二代碼進(jìn)行編譯得到的,所述第二代碼為在所述目標(biāo)方法原對應(yīng)的第一代碼中插入切面代碼后得到的;在執(zhí)行所述第二類字節(jié)碼的過程中,通過所述切面代碼記錄本次調(diào)用信息,并將所述調(diào)用信息作為歷史記錄進(jìn)行保存。
[0060]結(jié)合第六方面,在第六方面的第一種可能的實現(xiàn)方式中,所述處理器還用于:
[0061]執(zhí)行所述指令,在將所述調(diào)用信息作為歷史記錄進(jìn)行保存之后,從保存的歷史記錄中選擇第一歷史記錄,并確定重執(zhí)行所述第一歷史記錄對應(yīng)的攔截任務(wù);
[0062]對所述第一歷史記錄進(jìn)行反序列化,獲得所述第一歷史記錄對應(yīng)的目標(biāo)對象以及入?yún)ⅲ?br> [0063]根據(jù)一種編程語言Java反射機(jī)制,對所述目標(biāo)對象執(zhí)行的第一目標(biāo)方法進(jìn)行攔截,并向所述第一目標(biāo)方法傳入所述入?yún)ⅰ?br> [0064]本發(fā)明實施例中提供了一種針對目標(biāo)方法的監(jiān)控方法,也即提供了一種新的熱切入技術(shù),在要監(jiān)控目標(biāo)方法時,啟動一個代理進(jìn)程,并將代理進(jìn)程附加到調(diào)用進(jìn)程上,這樣,對目標(biāo)方法的代碼的修改可以由代理進(jìn)程完成,并最終將修改后的代碼寫回到調(diào)用進(jìn)程中,用修改后的代碼替換原代碼。這樣,后續(xù)在需要調(diào)用該目標(biāo)方法時,可以直接通過調(diào)用進(jìn)程進(jìn)行調(diào)用。
[0065]例如,如果要開發(fā)一個購票軟件,整個流程可能包括了選票、訂票、付款等過程。那么,采用本發(fā)明實施例中的技術(shù)方案后,如果需要對付款模塊對應(yīng)的代碼進(jìn)行測試,無需等到選票、訂票等過程均完成后再測試,而可以直接通過調(diào)用進(jìn)程對付款模塊對應(yīng)的代碼進(jìn)行調(diào)用即可完成測試,相對于現(xiàn)有技術(shù)來說,本發(fā)明實施例中的技術(shù)方案顯然提高了集成測試的效率,減少測試所需的時間。
[0066]另外,其他熱切入技術(shù)不能令修改后的代碼替換原代碼,在熱切入時原代碼不能發(fā)揮作用,因此只能對新建的對象進(jìn)行熱切入,而對已存在的對象無法實現(xiàn)熱切入,而本發(fā)明實施例中可以通過代理進(jìn)程對目標(biāo)方法的代碼進(jìn)行修改,并可以令修改后的代碼替換調(diào)用進(jìn)程中存儲的目標(biāo)方法的原代碼,這樣就可以實現(xiàn)對任意對象的熱切入,而不會只能夠像其他熱切入技術(shù)一樣只能對新建的對象進(jìn)行熱切入,本發(fā)明實施例中的技術(shù)方案應(yīng)用范圍更為廣泛,在測試時能夠?qū)Ω嗟膶ο筮M(jìn)行測試,實用性較高。

【專利附圖】

【附圖說明】
[0067]圖1為本發(fā)明實施例中針對目標(biāo)方法的監(jiān)控方法的主要流程圖;
[0068]圖2為本發(fā)明實施例中熱切入方法的主要流程圖;
[0069]圖3為本發(fā)明實施例中通過提供的熱切入技術(shù)進(jìn)行熱切入的實現(xiàn)流程圖;
[0070]圖4為本發(fā)明實施例中針對目標(biāo)方法的監(jiān)控裝置的主要結(jié)構(gòu)框圖;
[0071]圖5為本發(fā)明實施例中熱切入裝置的主要結(jié)構(gòu)框圖;
[0072]圖6為本發(fā)明實施例中針對目標(biāo)方法的監(jiān)控裝置的主要結(jié)構(gòu)示意圖;
[0073]圖7為本發(fā)明實施例中熱切入裝置的主要結(jié)構(gòu)示意圖。

【具體實施方式】
[0074]本發(fā)明實施例提供一種針對目標(biāo)方法的監(jiān)控方法,包括:在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼;通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果;通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。
[0075]本發(fā)明實施例中提供了一種針對目標(biāo)方法的監(jiān)控方法,也即提供了一種新的熱切入技術(shù),在要監(jiān)控目標(biāo)方法時,啟動一個代理進(jìn)程,并將代理進(jìn)程附加到調(diào)用進(jìn)程上,這樣,對目標(biāo)方法的代碼的修改可以由代理進(jìn)程完成,并最終將修改后的代碼寫回到調(diào)用進(jìn)程中,用修改后的代碼替換原代碼。這樣,后續(xù)在需要調(diào)用該目標(biāo)方法時,可以直接通過調(diào)用進(jìn)程進(jìn)行調(diào)用。
[0076]例如,如果要開發(fā)一個購票軟件,整個流程可能包括了選票、訂票、付款等過程。那么,采用本發(fā)明實施例中的技術(shù)方案后,如果需要對付款模塊對應(yīng)的代碼進(jìn)行測試,無需等到選票、訂票等過程均完成后再測試,而可以直接通過調(diào)用進(jìn)程對付款模塊對應(yīng)的代碼進(jìn)行調(diào)用即可完成測試,相對于現(xiàn)有技術(shù)來說,本發(fā)明實施例中的技術(shù)方案顯然提高了集成測試的效率,減少測試所需的時間。
[0077]另外,其他熱切入技術(shù)不能令修改后的代碼替換原代碼,在熱切入時原代碼不能發(fā)揮作用,因此只能對新建的對象進(jìn)行熱切入,而對已存在的對象無法實現(xiàn)熱切入,而本發(fā)明實施例中可以通過代理進(jìn)程對目標(biāo)方法的代碼進(jìn)行修改,并可以令修改后的代碼替換調(diào)用進(jìn)程中存儲的目標(biāo)方法的原代碼,這樣就可以實現(xiàn)對任意對象的熱切入,而不會只能夠像其他熱切入技術(shù)一樣只能對新建的對象進(jìn)行熱切入,本發(fā)明實施例中的技術(shù)方案應(yīng)用范圍更為廣泛,在測試時能夠?qū)Ω嗟膶ο筮M(jìn)行測試,實用性較高。
[0078]為使本發(fā)明實施例的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實施例是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護(hù)的范圍。
[0079]另外,本文中術(shù)語“系統(tǒng)”和“網(wǎng)絡(luò)”在本文中常被可互換使用。本文中術(shù)語“和/或”,僅僅是一種描述關(guān)聯(lián)對象的關(guān)聯(lián)關(guān)系,表示可以存在三種關(guān)系,例如,A和/或B,可以表示:單獨存在A,同時存在A和B,單獨存在B這三種情況。另外,本文中字符“/”,如無特殊說明,一般表示前后關(guān)聯(lián)對象是一種“或”的關(guān)系。
[0080]本發(fā)明實施例中的方法主要針對的是Java(—種面向?qū)ο蟮某绦蛟O(shè)計語言)語言。
[0081]下面結(jié)合說明書附圖對本發(fā)明實施例作進(jìn)一步詳細(xì)描述。
[0082]請參見圖1,本發(fā)明實施例提供一種針對目標(biāo)方法的監(jiān)控方法,所述方法的主要流程描述如下。
[0083]步驟101:在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼。
[0084]本發(fā)明實施例提出了一種新的AOP (Aspect Oriented Programming,面向切面編程)技術(shù),這種AOP技術(shù)無需對現(xiàn)有系統(tǒng)做任何適應(yīng)性改變,只需把JAR(Java Archive,Java歸檔文件)包放入目標(biāo)應(yīng)用的LIB (library,庫文件)目錄下就可以使用,實施較為方便。
[0085]可選的,本發(fā)明實施例中,啟動所述代理進(jìn)程,包括:通過VirtualMachine (虛擬機(jī))類的attach(附加)方法啟動所述代理進(jìn)程。
[0086]在SUM(—種函數(shù))提供的tools, jar (—種工具包)包里有個類,名為VirtualMachine0通過VirtualMachine類的attach方法,可以啟動所述代理進(jìn)程,并可以將所述代理進(jìn)程附加在指定的JVM(Java Virtual Machine, Java虛擬機(jī))進(jìn)程上,本發(fā)明實施例中將所述JVM進(jìn)程稱為所述調(diào)用進(jìn)程。所述代理進(jìn)程可以與目標(biāo)進(jìn)程進(jìn)行通信,并可以修改目標(biāo)進(jìn)程中的數(shù)據(jù)。
[0087]步驟102:通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果。
[0088]可選的,本發(fā)明實施例中,在通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的所述第一代碼中插入所述切面代碼,得到所述目標(biāo)方法對應(yīng)的所述第二類字節(jié)碼之前,還包括:
[0089]通過所述代理進(jìn)程,根據(jù)執(zhí)行所述代理進(jìn)程的入口方法的Instrumentat1n (儀器)對象,獲取所述調(diào)用進(jìn)程中所有已加載的類的信息;
[0090]通過所述代理進(jìn)程,根據(jù)所述調(diào)用進(jìn)程的監(jiān)控對象,從獲取的所有已加載的類的信息中確定所述目標(biāo)類,進(jìn)而確定所述目標(biāo)方法。[0091 ] 本發(fā)明實施例中,所述代理進(jìn)程的入口方法名為agentmain (主要代理),這個方法類似于Java中的main(主要)方法,是所述代理進(jìn)程的入口方法。在agentmain方法中,通過Instrumentat1n對象,可以獲取到所述調(diào)用進(jìn)程中所有已加載的類的信息,這樣所述代理進(jìn)程可以知道所述調(diào)用進(jìn)程中共包括有哪些類,而所述調(diào)用進(jìn)程會將所述調(diào)用進(jìn)程的監(jiān)控對象告知所述代理進(jìn)程,這樣,所述代理進(jìn)程就能從所述調(diào)用進(jìn)程包括的所有類中確定出所述監(jiān)控對象對應(yīng)的所述目標(biāo)類,進(jìn)而確定所述目標(biāo)方法。
[0092]可選的,本發(fā)明實施例中,通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的所述第一代碼中插入所述切面代碼,得到所述目標(biāo)方法對應(yīng)的所述第二類字節(jié)碼,可以包括:
[0093]通過所述代理進(jìn)程,使用Javassist在所述目標(biāo)方法所對應(yīng)的所述第一代碼中插入所述切面代碼,得到所述目標(biāo)方法對應(yīng)的第二代碼;
[0094]通過所述代理進(jìn)程對所述第二代碼進(jìn)行編譯,得到所述第二類字節(jié)碼。
[0095]本發(fā)明實施例中,在所述代理進(jìn)程中,使用Javassist (—個開源的分析、編輯和創(chuàng)建Java字節(jié)碼的類庫,也可稱為開源包)對所述目標(biāo)方法對應(yīng)的所述第一代碼進(jìn)行修改,在所述目標(biāo)方法的前后插入所述切面代碼,得到所述第二代碼。在得到所述第二代碼后,要對所述第二代碼進(jìn)行編譯,得到所述第二類字節(jié)碼。
[0096]步驟103:通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。
[0097]可選的,本發(fā)明實施例中,通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,可以包括:
[0098]通過所述代理進(jìn)程中的Instrumentat1n對象的RefineClass方法,將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程。
[0099]本發(fā)明實施例中,在所述代理進(jìn)程中,可以通過Instrumentat1n對象的RefineClass方法,把修改后的類字節(jié)碼(即所述第二類字節(jié)碼)寫回到所述調(diào)用進(jìn)程中。
[0100]因為所述調(diào)用進(jìn)程中已有與所述目標(biāo)方法對應(yīng)的所述第一類字節(jié)碼,在所述第一類字節(jié)碼生效時,已經(jīng)創(chuàng)建了 ClassLoader,而在將所述第二類字節(jié)碼寫回到所述調(diào)用進(jìn)程中時,可以令所述第二類字節(jié)碼替換所述第一類字節(jié)碼,相當(dāng)于修改了所述第一類字節(jié)碼,因此,在所述調(diào)用進(jìn)程中無需為所述第二類字節(jié)碼再次創(chuàng)建ClassLoader,所述第二類字節(jié)碼可以通過所述第一類字節(jié)碼對應(yīng)的ClassLoader立即生效。在此之后,在調(diào)用所述目標(biāo)方法時都會執(zhí)行修改后的代碼邏輯。
[0101]現(xiàn)有技術(shù)中存在的熱切入技術(shù),不能令修改后的代碼替換原代碼,在熱切入時原代碼不能發(fā)揮作用,因此只能對新建的對象進(jìn)行熱切入,對已存在的對象無法實現(xiàn)熱切入。而本發(fā)明實施例中提供的針對目標(biāo)對象的監(jiān)控方法,即提出的新的AOP技術(shù),可以通過代理進(jìn)程對目標(biāo)方法的代碼進(jìn)行修改,并可以令修改后的代碼替換調(diào)用進(jìn)程中存儲的目標(biāo)方法的原代碼,這樣就可以通過API (Applicat1n Programming Interface,應(yīng)用程序編程接口 )對任意方法進(jìn)行動態(tài)切入,即實現(xiàn)對任意對象的熱切入,無論目標(biāo)方法是否屬于已存在的對象都可以進(jìn)行切入,而不會只能夠像其他熱切入技術(shù)一樣只能對新建的對象進(jìn)行熱切入,也無需在啟動前預(yù)定義被切入的目標(biāo)方法。本發(fā)明實施例中的技術(shù)方案應(yīng)用范圍更為廣泛,在測試時能夠?qū)Ω嗟膶ο筮M(jìn)行測試,實用性較高。
[0102]請參見圖2,基于同一發(fā)明構(gòu)思,本發(fā)明實施例提供一種熱切入方法,所述方法即是利用圖1流程中所介紹的新的AOP技術(shù)進(jìn)行熱切入的方法。所述方法的主要流程描述如下。
[0103]步驟201:在通過調(diào)用進(jìn)程對目標(biāo)方法進(jìn)行攔截時,執(zhí)行所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;其中,所述第二類字節(jié)碼為對所述目標(biāo)方法對應(yīng)的第二代碼進(jìn)行編譯得到的,所述第二代碼為在所述目標(biāo)方法原對應(yīng)的第一代碼中插入切面代碼后得到的。
[0104]經(jīng)過圖1流程后,所述調(diào)用進(jìn)程中所述目標(biāo)方法對應(yīng)的類字節(jié)碼已被修改為所述第二類字節(jié)碼,因此,在通過所述調(diào)用進(jìn)程對所述目標(biāo)方法進(jìn)行攔截時,自然要執(zhí)行所述第二類字節(jié)碼。具體得到所述第二類字節(jié)碼的方式在圖1流程中已有介紹,此處不多贅述。
[0105]步驟202:在執(zhí)行所述第二類字節(jié)碼的過程中,通過所述切面代碼記錄本次調(diào)用信息,并將所述調(diào)用信息作為歷史記錄進(jìn)行保存。
[0106]使用本發(fā)明實施例中提供的新的AOP技術(shù),對所述目標(biāo)方法進(jìn)行攔截后,當(dāng)所述目標(biāo)方法被調(diào)用時,就會先調(diào)用切面中的自定義代碼,即執(zhí)行所述第二類字節(jié)碼。
[0107]而自定義代碼中實現(xiàn)了對所述目標(biāo)方法的入?yún)⒌某志没4?,會生成針對所述目?biāo)方法的一次調(diào)用的調(diào)用信息。這里所說的持久化可以是寫入文件,或可以是寫入數(shù)據(jù)庫。為了減少本AOP技術(shù)對其他部件的依賴性,本發(fā)明實施例可以采取將歷史記錄寫入文件的方式。
[0108]例如,可以使用Jbosscache (—個復(fù)制的事務(wù)處理緩存)來提供將歷史記錄保存到文件的能力。Jbosscache可以將歷史記錄直接緩存到文件中,從而變相實現(xiàn)了對歷史記錄的持久化。本發(fā)明實施例中,各個歷史記錄可以保存在同一文件中,或者也可以保存在不同的文件中。
[0109]本發(fā)明實施例中可以將該調(diào)用信息持久化到文件中,即將該調(diào)用信息作為一條歷史記錄進(jìn)行保存,這樣,下次仍然可以通過該歷史記錄來調(diào)用所述目標(biāo)方法。
[0110]進(jìn)一步的,本發(fā)明實施例中,在將所述調(diào)用信息作為歷史記錄進(jìn)行保存之后,還包括:
[0111]從保存的歷史記錄中選擇第一歷史記錄,并確定重執(zhí)行所述第一歷史記錄對應(yīng)的攔截任務(wù);
[0112]對所述第一歷史記錄進(jìn)行反序列化,獲得所述第一歷史記錄對應(yīng)的目標(biāo)對象以及入?yún)ⅲ?br> [0113]根據(jù)一種編程語言Java反射機(jī)制,對所述目標(biāo)對象執(zhí)行的第一目標(biāo)方法進(jìn)行攔截,并向所述第一目標(biāo)方法傳入所述入?yún)ⅰ?br> [0114]S卩,本發(fā)明實施例中,在攔截某一目標(biāo)方法時,可以直接攔截,或者也可以通過與該目標(biāo)方法對應(yīng)的歷史記錄來進(jìn)行攔截,操作方式可以任意。本發(fā)明實施例中,與一個目標(biāo)方法對應(yīng)的歷史記錄可能包括一條,也可能包括多條,如果包括多條,那么可以通過任意一條來攔截該目標(biāo)方法。
[0115]本發(fā)明實施例中的新的AOP技術(shù),在實施時可以有專門的操作工具來執(zhí)行,該操作工具對應(yīng)有操作界面,可以將該操作工作稱為API調(diào)測工具。當(dāng)使用者通過該操作界面選擇某個歷史記錄,發(fā)起對API的重新執(zhí)行時,則系統(tǒng)從文件中讀取出該歷史記錄對應(yīng)的數(shù)據(jù),然后進(jìn)行以下處理:
[0116]從文件中反序列化出歷史記錄中記載的目標(biāo)類的對象實例,以及,從文件中反序列化出該歷史記錄對應(yīng)的入?yún)ο罅斜怼?br> [0117]通過Java反射機(jī)制,直接調(diào)用對象實例上的指定方法,即所述目標(biāo)方法,并傳入該歷史記錄中記載的入?yún)ο蟆?br> [0118]在本次調(diào)用之后,又會生成一條新的歷史記錄,系統(tǒng)可以繼續(xù)保存該條新生成的歷史記錄。
[0119]本發(fā)明實施例中的熱切入方法提供了修改對象實例的方法,該能力依賴于Java的反射機(jī)制,可以分析一個對象的結(jié)構(gòu),將對象的屬性按樹結(jié)構(gòu)顯示出來,并可以修改基本類型的屬性的值。
[0120]下面用一個較為完整的流程來介紹本發(fā)明實施例中的AOP技術(shù)的建立方法(即針對目標(biāo)對象的監(jiān)控方法)以及利用該AOP技術(shù)進(jìn)行熱切入的方法。
[0121]請參見圖3,為本發(fā)明實施例中兩個實現(xiàn)過程的完整方法流程圖。
[0122]1、使用者在目標(biāo)WEB(網(wǎng)頁)應(yīng)用進(jìn)程上執(zhí)行業(yè)務(wù),業(yè)務(wù)觸發(fā)了目標(biāo)方法。此時目標(biāo)方法按原始代碼(即所述第一類字節(jié)碼)執(zhí)行,不會被API調(diào)測工具監(jiān)控。
[0123]2、使用者在API調(diào)測工具的操作界面中,選擇要監(jiān)控的目標(biāo)類的目標(biāo)方法,啟動監(jiān)控。
[0124]3、API調(diào)測工具生成監(jiān)控對象,即需要監(jiān)控的目標(biāo)類的目標(biāo)方法。
[0125]4、API調(diào)測工具調(diào)用JDK (Java Development Kit, Java語言的軟件開發(fā)工具包)的虛擬機(jī)API啟動所述代理進(jìn)程,并向所述代理進(jìn)程傳入所述監(jiān)控對象。
[0126]5、所述代理進(jìn)程被貼附到調(diào)用進(jìn)程上后,所述代理進(jìn)程根據(jù)監(jiān)控對象,在所述調(diào)用進(jìn)程所啟用的類中查找到要監(jiān)控的目標(biāo)類的目標(biāo)方法。所述代理進(jìn)程中對目標(biāo)方法對應(yīng)的第一代碼中注入切面代碼。
[0127]6、所述代理進(jìn)程中將修改后的代碼(即所述第二代碼)轉(zhuǎn)換成新的類字節(jié)碼,即所述第二類字節(jié)碼。
[0128]7、將新的類字節(jié)碼通過JDK的重定義類API,寫回到所述調(diào)用進(jìn)程。此時完成了對目標(biāo)方法的監(jiān)控啟動。
[0129]8、使用者再次在目標(biāo)WEB應(yīng)用進(jìn)程上執(zhí)行業(yè)務(wù),業(yè)務(wù)觸發(fā)所述目標(biāo)方法時,執(zhí)行的是切入后的新代碼,即所述第二類字節(jié)碼。
[0130]9、所述目標(biāo)方法的新代碼中會調(diào)用API調(diào)測工具里的切面代碼邏輯。
[0131]10、切面代碼里會記錄下所述目標(biāo)方法的調(diào)用記錄,包括入?yún)⒑蛯ο髮嵗?。該調(diào)用記錄可以被保存,以及,該調(diào)用記錄也可以稱為歷史記錄。
[0132]11、使用者可以在API調(diào)測工具中對所述目標(biāo)方法的歷史記錄進(jìn)行重執(zhí)行。S卩,通過所述目標(biāo)方法對應(yīng)的任一個歷史記錄重新攔截所述目標(biāo)方法。
[0133]12、API調(diào)測工具會通過JAVA反射機(jī)制調(diào)用所述目標(biāo)方法,并傳入所述歷史記錄中保存的入?yún)⒑蛯ο髮嵗?br> [0134]請參見圖4,基于同一發(fā)明構(gòu)思,本發(fā)明實施例提供一種針對目標(biāo)方法的監(jiān)控裝置,所述裝置包括啟動模塊401、插入模塊402和替換模塊403。
[0135]啟動模塊401,用于在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼;
[0136]插入模塊402,用于通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果;
[0137]替換模塊403,用于通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。
[0138]可選的,本發(fā)明實施例中,啟動模塊401用于啟動代理進(jìn)程,具體為:通過虛擬機(jī)VirtualMachine類的附加attach方法啟動所述代理進(jìn)程。
[0139]可選的,本發(fā)明實施例中,所述裝置還包括獲取模塊和確定模塊;
[0140]所述獲取模塊用于:在插入模塊402通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼之前,通過所述代理進(jìn)程,根據(jù)執(zhí)行所述代理進(jìn)程的入口方法的儀器Instrumentat1n對象,獲取所述調(diào)用進(jìn)程中所有已加載的類的信息;
[0141]所述確定模塊用于:通過所述代理進(jìn)程,根據(jù)所述調(diào)用進(jìn)程的監(jiān)控對象,從獲取的所有已加載的類的信息中確定所述目標(biāo)類,進(jìn)而確定所述目標(biāo)方法。
[0142]可選的,本發(fā)明實施例中,插入模塊402具體用于:
[0143]通過所述代理進(jìn)程,使用開源包Javassist在所述目標(biāo)方法所對應(yīng)的所述第一代碼中插入所述切面代碼,得到所述目標(biāo)方法對應(yīng)的第二代碼;
[0144]通過所述代理進(jìn)程對所述第二代碼進(jìn)行編譯,得到所述第二類字節(jié)碼。
[0145]可選的,本發(fā)明實施例中,替換模塊403用于通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,具體為:
[0146]通過所述代理進(jìn)程中的Instrumentat1n對象的一種方法RefineClass方法,將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程。
[0147]請參見圖5,基于同一發(fā)明構(gòu)思,本發(fā)明實施例提供一種熱切入裝置,所述裝置包括執(zhí)行模塊501和記錄模塊502。
[0148]執(zhí)行模塊501,用于在通過調(diào)用進(jìn)程對目標(biāo)方法進(jìn)行攔截時,執(zhí)行所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;其中,所述第二類字節(jié)碼為對所述目標(biāo)方法對應(yīng)的第二代碼進(jìn)行編譯得到的,所述第二代碼為在所述目標(biāo)方法原對應(yīng)的第一代碼中插入切面代碼后得到的;
[0149]記錄模塊502,用于在執(zhí)行所述第二類字節(jié)碼的過程中,通過所述切面代碼記錄本次調(diào)用信息,并將所述調(diào)用信息作為歷史記錄進(jìn)行保存。
[0150]可選的,本發(fā)明實施例中,所述裝置還包括選擇模塊、獲取模塊和攔截模塊;
[0151]所述選擇模塊用于從保存的歷史記錄中選擇第一歷史記錄,并確定重執(zhí)行所述第一歷史記錄對應(yīng)的攔截任務(wù);
[0152]所述獲取模塊用于對所述第一歷史記錄進(jìn)行反序列化,獲得所述第一歷史記錄對應(yīng)的目標(biāo)對象以及入?yún)ⅲ?br> [0153]所述攔截模塊用于根據(jù)一種編程語言Java反射機(jī)制,對所述目標(biāo)對象執(zhí)行的第一目標(biāo)方法進(jìn)行攔截,并向所述第一目標(biāo)方法傳入所述入?yún)ⅰ?br> [0154]請參見圖6,基于同一發(fā)明構(gòu)思,本發(fā)明實施例提供另一種針對目標(biāo)方法的監(jiān)控裝置,所述裝置與圖4中所示的裝置可以是同一裝置。所述裝置包括連接到同一總線600的存儲器601和處理器602。其中,存儲器601用于存儲處理器602執(zhí)行任務(wù)所需的指令;處理器602用于執(zhí)行存儲器601存儲的指令,在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼;通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果;通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。
[0155]可選的,本發(fā)明實施例中,處理器602用于啟動代理進(jìn)程,具體為:通過虛擬機(jī)VirtualMachine類的附加attach方法啟動所述代理進(jìn)程。
[0156]可選的,本發(fā)明實施例中,處理器602還用于:
[0157]執(zhí)行所述指令,在通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼之前,通過所述代理進(jìn)程,根據(jù)執(zhí)行所述代理進(jìn)程的入口方法的儀器Instrumentat1n對象,獲取所述調(diào)用進(jìn)程中所有已加載的類的信息;
[0158]通過所述代理進(jìn)程,根據(jù)所述調(diào)用進(jìn)程的監(jiān)控對象,從獲取的所有已加載的類的信息中確定所述目標(biāo)類,進(jìn)而確定所述目標(biāo)方法。
[0159]可選的,本發(fā)明實施例中,處理器602用于通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼,具體為:
[0160]通過所述代理進(jìn)程,使用開源包Javassist在所述目標(biāo)方法所對應(yīng)的所述第一代碼中插入所述切面代碼,得到所述目標(biāo)方法對應(yīng)的第二代碼;
[0161]通過所述代理進(jìn)程對所述第二代碼進(jìn)行編譯,得到所述第二類字節(jié)碼。
[0162]可選的,本發(fā)明實施例中,處理器602用于通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,具體為:
[0163]通過所述代理進(jìn)程中的Instrumentat1n對象的一種方法RefineClass方法,將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程。
[0164]請參見圖7,基于同一發(fā)明構(gòu)思,本發(fā)明實施例提供另一種熱切入裝置,所述裝置與圖5中所示的裝置可以是同一裝置。所述裝置包括連接到同一總線700的存儲器701和處理器702。其中,存儲器701用于存儲處理器702執(zhí)行任務(wù)所需的指令;處理器702用于執(zhí)行存儲器701存儲的指令,在通過調(diào)用進(jìn)程對目標(biāo)方法進(jìn)行攔截時,執(zhí)行所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;其中,所述第二類字節(jié)碼為對所述目標(biāo)方法對應(yīng)的第二代碼進(jìn)行編譯得到的,所述第二代碼為在所述目標(biāo)方法原對應(yīng)的第一代碼中插入切面代碼后得到的;在執(zhí)行所述第二類字節(jié)碼的過程中,通過所述切面代碼記錄本次調(diào)用信息,并將所述調(diào)用信息作為歷史記錄進(jìn)行保存。
[0165]可選的,本發(fā)明實施例中,處理器702還用于:
[0166]執(zhí)行所述指令,在將所述調(diào)用信息作為歷史記錄進(jìn)行保存之后,從保存的歷史記錄中選擇第一歷史記錄,并確定重執(zhí)行所述第一歷史記錄對應(yīng)的攔截任務(wù);
[0167]對所述第一歷史記錄進(jìn)行反序列化,獲得所述第一歷史記錄對應(yīng)的目標(biāo)對象以及入?yún)ⅲ?br> [0168]根據(jù)一種編程語言Java反射機(jī)制,對所述目標(biāo)對象執(zhí)行的第一目標(biāo)方法進(jìn)行攔截,并向所述第一目標(biāo)方法傳入所述入?yún)ⅰ?br> [0169]本發(fā)明實施例提供一種針對目標(biāo)方法的監(jiān)控方法,包括:在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼;通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果;通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。
[0170]本發(fā)明實施例中提供了一種針對目標(biāo)方法的監(jiān)控方法,也即提供了一種新的熱切入技術(shù),在要監(jiān)控目標(biāo)方法時,啟動一個代理進(jìn)程,并將代理進(jìn)程附加到調(diào)用進(jìn)程上,這樣,對目標(biāo)方法的代碼的修改可以由代理進(jìn)程完成,并最終將修改后的代碼寫回到調(diào)用進(jìn)程中,用修改后的代碼替換原代碼。這樣,后續(xù)在需要調(diào)用該目標(biāo)方法時,可以直接通過調(diào)用進(jìn)程進(jìn)行調(diào)用。
[0171]例如,如果要開發(fā)一個購票軟件,整個流程可能包括了選票、訂票、付款等過程。那么,采用本發(fā)明實施例中的技術(shù)方案后,如果需要對付款模塊對應(yīng)的代碼進(jìn)行測試,無需等到選票、訂票等過程均完成后再測試,而可以直接通過調(diào)用進(jìn)程對付款模塊對應(yīng)的代碼進(jìn)行調(diào)用即可完成測試,相對于現(xiàn)有技術(shù)來說,本發(fā)明實施例中的技術(shù)方案顯然提高了集成測試的效率,減少測試所需的時間。
[0172]另外,其他熱切入技術(shù)不能令修改后的代碼替換原代碼,在熱切入時原代碼不能發(fā)揮作用,因此只能對新建的對象進(jìn)行熱切入,而對已存在的對象無法實現(xiàn)熱切入,而本發(fā)明實施例中可以通過代理進(jìn)程對目標(biāo)方法的代碼進(jìn)行修改,并可以令修改后的代碼替換調(diào)用進(jìn)程中存儲的目標(biāo)方法的原代碼,這樣就可以實現(xiàn)對任意對象的熱切入,而不會只能夠像其他熱切入技術(shù)一樣只能對新建的對象進(jìn)行熱切入,本發(fā)明實施例中的技術(shù)方案應(yīng)用范圍更為廣泛,在測試時能夠?qū)Ω嗟膶ο筮M(jìn)行測試,實用性較高。
[0173]所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡潔,僅以上述各功能模塊的劃分進(jìn)行舉例說明,實際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。上述描述的系統(tǒng),裝置和單元的具體工作過程,可以參考前述方法實施例中的對應(yīng)過程,在此不再贅述。
[0174]在本申請所提供的幾個實施例中,應(yīng)該理解到,所揭露的系統(tǒng),裝置和方法,可以通過其它的方式實現(xiàn)。例如,以上所描述的裝置實施例僅僅是示意性的,例如,所述模塊或單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機(jī)械或其它的形式。
[0175]所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。
[0176]另外,在本申請各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用軟件功能單元的形式實現(xiàn)。
[0177]所述集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,可以存儲在一個計算機(jī)可讀取存儲介質(zhì)中。基于這樣的理解,本申請的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機(jī)軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機(jī)設(shè)備(可以是個人計算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)或處理器(processor)執(zhí)行本申請各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:U盤、移動硬盤、只讀存儲器、隨機(jī)存取存儲器、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
[0178]以上所述,以上實施例僅用以對本申請的技術(shù)方案進(jìn)行了詳細(xì)介紹,但以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想,不應(yīng)理解為對本發(fā)明的限制。本【技術(shù)領(lǐng)域】的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種針對目標(biāo)方法的監(jiān)控方法,其特征在于,包括: 在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼; 通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果; 通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。
2.如權(quán)利要求1所述的方法,其特征在于,啟動代理進(jìn)程,包括:通過虛擬機(jī)VirtualMachine類的附加attach方法啟動所述代理進(jìn)程。
3.如權(quán)利要求1或2所述的方法,其特征在于,在通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼之前,還包括: 通過所述代理進(jìn)程,根據(jù)執(zhí)行所述代理進(jìn)程的入口方法的儀器Instrumentat1n對象,獲取所述調(diào)用進(jìn)程中所有已加載的類的信息; 通過所述代理進(jìn)程,根據(jù)所述調(diào)用進(jìn)程的監(jiān)控對象,從獲取的所有已加載的類的信息中確定所述目標(biāo)類,進(jìn)而確定所述目標(biāo)方法。
4.如權(quán)利要求1-3任一所述的方法,其特征在于,通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼,包括: 通過所述代理進(jìn)程,使用開源包Javassist在所述目標(biāo)方法所對應(yīng)的所述第一代碼中插入所述切面代碼,得到所述目標(biāo)方法對應(yīng)的第二代碼; 通過所述代理進(jìn)程對所述第二代碼進(jìn)行編譯,得到所述第二類字節(jié)碼。
5.如權(quán)利要求4所述的方法,其特征在于,通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,包括: 通過所述代理進(jìn)程中的Instrumentat1n對象的一種方法RefineClass方法,將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程。
6.一種熱切入方法,其特征在于,包括: 在通過調(diào)用進(jìn)程對目標(biāo)方法進(jìn)行攔截時,執(zhí)行所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;其中,所述第二類字節(jié)碼為對所述目標(biāo)方法對應(yīng)的第二代碼進(jìn)行編譯得到的,所述第二代碼為在所述目標(biāo)方法原對應(yīng)的第一代碼中插入切面代碼后得到的; 在執(zhí)行所述第二類字節(jié)碼的過程中,通過所述切面代碼記錄本次調(diào)用信息,并將所述調(diào)用信息作為歷史記錄進(jìn)行保存。
7.如權(quán)利要求6所述的方法,其特征在于,在將所述調(diào)用信息作為歷史記錄進(jìn)行保存之后,還包括: 從保存的歷史記錄中選擇第一歷史記錄,并確定重執(zhí)行所述第一歷史記錄對應(yīng)的攔截任務(wù); 對所述第一歷史記錄進(jìn)行反序列化,獲得所述第一歷史記錄對應(yīng)的目標(biāo)對象以及入?yún)? 根據(jù)一種編程語言Java反射機(jī)制,對所述目標(biāo)對象執(zhí)行的第一目標(biāo)方法進(jìn)行攔截,并向所述第一目標(biāo)方法傳入所述入?yún)ⅰ?br> 8.一種針對目標(biāo)方法的監(jiān)控裝置,其特征在于,包括: 啟動模塊,用于在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼; 插入模塊,用于通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果; 替換模塊,用于通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。
9.如權(quán)利要求8所述的裝置,其特征在于,所述啟動模塊用于啟動代理進(jìn)程,具體為:通過虛擬機(jī)VirtualMachine類的附加attach方法啟動所述代理進(jìn)程。
10.如權(quán)利要求8或9所述的裝置,其特征在于,所述裝置還包括獲取模塊和確定模塊; 所述獲取模塊用于:在所述插入模塊通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼之前,通過所述代理進(jìn)程,根據(jù)執(zhí)行所述代理進(jìn)程的入口方法的儀器Instrumentat1n對象,獲取所述調(diào)用進(jìn)程中所有已加載的類的信息; 所述確定模塊用于:通過所述代理進(jìn)程,根據(jù)所述調(diào)用進(jìn)程的監(jiān)控對象,從獲取的所有已加載的類的信息中確定所述目標(biāo)類,進(jìn)而確定所述目標(biāo)方法。
11.如權(quán)利要求8-10任一所述的裝置,其特征在于,所述插入模塊具體用于: 通過所述代理進(jìn)程,使用開源包Javassist在所述目標(biāo)方法所對應(yīng)的所述第一代碼中插入所述切面代碼,得到所述目標(biāo)方法對應(yīng)的第二代碼; 通過所述代理進(jìn)程對所述第二代碼進(jìn)行編譯,得到所述第二類字節(jié)碼。
12.如權(quán)利要求11所述的裝置,其特征在于,所述替換模塊用于通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,具體為: 通過所述代理進(jìn)程中的Instrumentat1n對象的一種方法RefineClass方法,將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程。
13.一種熱切入裝置,其特征在于,包括: 執(zhí)行模塊,用于在通過調(diào)用進(jìn)程對目標(biāo)方法進(jìn)行攔截時,執(zhí)行所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;其中,所述第二類字節(jié)碼為對所述目標(biāo)方法對應(yīng)的第二代碼進(jìn)行編譯得到的,所述第二代碼為在所述目標(biāo)方法原對應(yīng)的第一代碼中插入切面代碼后得到的; 記錄模塊,用于在執(zhí)行所述第二類字節(jié)碼的過程中,通過所述切面代碼記錄本次調(diào)用信息,并將所述調(diào)用信息作為歷史記錄進(jìn)行保存。
14.如權(quán)利要求13所述的裝置,其特征在于,所述裝置還包括選擇模塊、獲取模塊和攔截模塊; 所述選擇模塊用于從保存的歷史記錄中選擇第一歷史記錄,并確定重執(zhí)行所述第一歷史記錄對應(yīng)的攔截任務(wù); 所述獲取模塊用于對所述第一歷史記錄進(jìn)行反序列化,獲得所述第一歷史記錄對應(yīng)的目標(biāo)對象以及入?yún)ⅲ? 所述攔截模塊用于根據(jù)一種編程語言Java反射機(jī)制,對所述目標(biāo)對象執(zhí)行的第一目標(biāo)方法進(jìn)行攔截,并向所述第一目標(biāo)方法傳入所述入?yún)ⅰ?br> 15.一種針對目標(biāo)方法的監(jiān)控裝置,其特征在于,包括連接到同一總線的存儲器和處理器; 所述存儲器,用于存儲指令; 所述處理器,用于執(zhí)行所述指令,在通過調(diào)用進(jìn)程監(jiān)控目標(biāo)類對應(yīng)的目標(biāo)方法時,啟動代理進(jìn)程,并將所述代理進(jìn)程附加在所述調(diào)用進(jìn)程上;其中,在所述調(diào)用進(jìn)程中,所述目標(biāo)方法對應(yīng)于第一類字節(jié)碼;通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;所述第一類字節(jié)碼為將所述第一代碼編譯后得到的結(jié)果;通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,并以所述第二類字節(jié)碼替換所述第一類字節(jié)碼。
16.如權(quán)利要求15所述的裝置,其特征在于,所述處理器用于啟動代理進(jìn)程,具體為:通過虛擬機(jī)VirtualMachine類的附加attach方法啟動所述代理進(jìn)程。
17.如權(quán)利要求15或16所述的裝置,其特征在于,所述處理器還用于: 執(zhí)行所述指令,在通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼之前,通過所述代理進(jìn)程,根據(jù)執(zhí)行所述代理進(jìn)程的入口方法的儀器Instrumentat1n對象,獲取所述調(diào)用進(jìn)程中所有已加載的類的信息; 通過所述代理進(jìn)程,根據(jù)所述調(diào)用進(jìn)程的監(jiān)控對象,從獲取的所有已加載的類的信息中確定所述目標(biāo)類,進(jìn)而確定所述目標(biāo)方法。
18.如權(quán)利要求15-17任一所述的裝置,其特征在于,所述處理器用于通過所述代理進(jìn)程在所述目標(biāo)方法所對應(yīng)的第一代碼中插入切面代碼,得到所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼,具體為: 通過所述代理進(jìn)程,使用開源包Javassist在所述目標(biāo)方法所對應(yīng)的所述第一代碼中插入所述切面代碼,得到所述目標(biāo)方法對應(yīng)的第二代碼; 通過所述代理進(jìn)程對所述第二代碼進(jìn)行編譯,得到所述第二類字節(jié)碼。
19.如權(quán)利要求18所述的裝置,其特征在于,所述處理器用于通過所述代理進(jìn)程將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程,具體為: 通過所述代理進(jìn)程中的Instrumentat1n對象的一種方法RefineClass方法,將所述第二類字節(jié)碼寫入所述調(diào)用進(jìn)程。
20.一種熱切入裝置,其特征在于,包括連接到同一總線的存儲器和處理器; 所述存儲器,用于存儲指令; 所述處理器,用于執(zhí)行所述指令,在通過調(diào)用進(jìn)程對目標(biāo)方法進(jìn)行攔截時,執(zhí)行所述目標(biāo)方法對應(yīng)的第二類字節(jié)碼;其中,所述第二類字節(jié)碼為對所述目標(biāo)方法對應(yīng)的第二代碼進(jìn)行編譯得到的,所述第二代碼為在所述目標(biāo)方法原對應(yīng)的第一代碼中插入切面代碼后得到的;在執(zhí)行所述第二類字節(jié)碼的過程中,通過所述切面代碼記錄本次調(diào)用信息,并將所述調(diào)用信息作為歷史記錄進(jìn)行保存。
21.如權(quán)利要求20所述的裝置,其特征在于,所述處理器還用于: 執(zhí)行所述指令,在將所述調(diào)用信息作為歷史記錄進(jìn)行保存之后,從保存的歷史記錄中選擇第一歷史記錄,并確定重執(zhí)行所述第一歷史記錄對應(yīng)的攔截任務(wù); 對所述第一歷史記錄進(jìn)行反序列化,獲得所述第一歷史記錄對應(yīng)的目標(biāo)對象以及入?yún)? 根據(jù)一種編程語言Java反射機(jī)制,對所述目標(biāo)對象執(zhí)行的第一目標(biāo)方法進(jìn)行攔截,并向所述第一目標(biāo)方法傳入所述入?yún)ⅰ?br> 【文檔編號】G06F11/36GK104391787SQ201410643169
【公開日】2015年3月4日 申請日期:2014年11月13日 優(yōu)先權(quán)日:2014年11月13日
【發(fā)明者】蘇胄 申請人:華為軟件技術(shù)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1