專利名稱:針對java字節(jié)碼文件的快速自動修改方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種自動改進(jìn)由java語言編寫的計(jì)算機(jī)軟件系統(tǒng),使之具有快 速自恢復(fù)能力的技術(shù),尤其是基于微重啟技術(shù)的使軟件系統(tǒng)具有快速自恢復(fù)能力 的自動改進(jìn)技術(shù)。
(二)
背景技術(shù):
隨著軟件系統(tǒng)功能的日益強(qiáng)大,其結(jié)構(gòu)也越來越復(fù)雜,不可避免的bug也越 來越多。完全消除bug已成為不可能,但是人們對軟件系統(tǒng)的要求卻并沒有降 低。因此,如何在系統(tǒng)失效后快速得恢復(fù)已成為學(xué)術(shù)界與業(yè)界的研究的重點(diǎn)。
自恢復(fù)方法有很多,微重啟是其中最簡單有效的一種。例如本發(fā)明的申請人 前期提出的申請?zhí)枮?00810064941.6的專利申請文件中提出的《一種通用的基 于遞歸微重啟技術(shù)的任務(wù)關(guān)鍵系統(tǒng)快速自恢復(fù)方法》等。
與本專利最相關(guān)的已有技術(shù)有日本電器株式會社的內(nèi)田熏于2003年申請 了專利《自恢復(fù)型程序,程序生成方法和設(shè)備,信息處理設(shè)備》(申請?zhí)?03107849.4,公開號CN1447226)。應(yīng)用該專利能生成自恢復(fù)型程序,但其工 作原理與適用范圍都和本專利申請不同;文獻(xiàn)《Transformation of Existing Programs into Autonomic and Self-healing Entities》(In proceedings of the 14th Annual IEEE International Conference and Workshops on the Engineering of Computer-Based Systems, 2007 (ECBS'07))(譯:《將現(xiàn)有程 序轉(zhuǎn)換為自律自愈實(shí)體》(第14屆基于計(jì)算機(jī)的系統(tǒng)工程年度國際會議,2007)) 中提出的轉(zhuǎn)換方法應(yīng)用java的克隆與反射機(jī)制實(shí)施恢復(fù),其恢復(fù)機(jī)制與本專利 基于遞歸微重啟的恢復(fù)不同。
(三)
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種能自動改進(jìn)java字節(jié)碼文件(.class文件)使 由其組成的系統(tǒng)具有基于遞歸微重啟的快速自恢復(fù)能力的針對Java字節(jié)碼文件 的快速自動修改方法。
本發(fā)朋的目的是這樣實(shí)現(xiàn)的a) 根據(jù)輸入的Java字節(jié)碼文件的路徑名(本地文件的絕對路徑名或網(wǎng)絡(luò) 文件的url地址)讀取java字節(jié)碼文件(.class的文件),并檢査該java字節(jié) 碼文件是否己經(jīng)被修改過,如果已被修改,則不再對該文件進(jìn)行處理,否則, 轉(zhuǎn)步驟b);
b) 獲取Java字節(jié)碼文件中所有聲明的方法,并將方法的信息存入一個數(shù) 組,方法信息中包括方法的方法名、返回值、異常表信息,將遍歷指針置于 數(shù)組起始位置;
c) 檢查數(shù)組中下一個方法信息,若其可能拋出異常,轉(zhuǎn)步驟d),否則, 繼續(xù)檢查數(shù)組中的下一個方法,若讀到數(shù)組尾,轉(zhuǎn)步驟h);
d) 對可能拋出異常的方法的原方法,獲取其方法名;
e) 將原方法重新命名;
f) 根據(jù)原方法的信息(包括其方法名、返回值、異常表等信息),創(chuàng)建新 的方法,并使用原方法的方法名作為新方法的方法名,原方法的返回值作為
新方法的返回值,原方法的異常表作為新方法的異常表;
g) 構(gòu)造新方法的方法體,在其方法體中調(diào)用原方法,并將調(diào)用語句封裝 為可微重啟元素,具體的封裝方法,應(yīng)用專利《通用的基于遞歸微重啟技術(shù) 的快速自恢復(fù)方法》中所提出的方法,成功封裝后,轉(zhuǎn)步驟C);
h) 向被處理的Java字節(jié)碼文件中添加標(biāo)記,該標(biāo)記表明該Java字節(jié)碼文 件已經(jīng)被該方法處理過,以避免對該Java字節(jié)碼文件進(jìn)行重復(fù)改進(jìn);
i) 將以上所作修改寫入java字節(jié)碼文件。 本發(fā)明所提出上述方法中,關(guān)于對可能拋出異常的方法的處理的策略,應(yīng)用
了本專利申請者之前申請的專利《通用的基于遞歸微重啟技術(shù)的快速自恢復(fù)方
法》中所提出的方法,即將可能產(chǎn)生異常的語句封裝成可微重啟元素,方法的適 用情況如《通用的基于遞歸微重啟技術(shù)的快速自恢復(fù)方法》中所述,并且只針對 Java字節(jié)碼文件適用。
本發(fā)明的優(yōu)點(diǎn)有(l)應(yīng)用《通用的基于遞歸微重啟技術(shù)的快速自恢復(fù)方法》 中所提出的方法改進(jìn)Java字節(jié)碼文件,由于《通用的基于遞歸微重啟技術(shù)的快 速自恢復(fù)方法》中所提出的方法已被實(shí)驗(yàn)證明是成功的、有效的,所以應(yīng)用本發(fā) 明所改進(jìn)的由java字節(jié)碼文件組成的系統(tǒng)具有很好的可微重啟特性;(2)本發(fā)明針對Java字節(jié)碼文件進(jìn)行處理,不僅可以適用于無源文件(.java文件)的 情況,同時(shí)節(jié)省了二次編譯的開銷;(3)本發(fā)明實(shí)現(xiàn)了自動處理的功能,從而避 免了對原文件(.Java文件或.class文件)的逐個改進(jìn),可節(jié)省開發(fā)人員或代碼 改進(jìn)人員的時(shí)間和精力。由java編寫的系統(tǒng)應(yīng)用十分廣泛,因此,本方法具有 廣闊的應(yīng)用前景。
(四)
圖1為本發(fā)明的算法構(gòu)成圖; 圖2為本發(fā)明的方法的流程圖。
具體實(shí)施方式
下面結(jié)合附圖舉例對本發(fā)明做更詳細(xì)地描述
本發(fā)明提供了一種針對java字節(jié)碼文件的、對其進(jìn)行自動改進(jìn)并使由其組 成的系統(tǒng)具有基于遞歸微重啟的快速自恢復(fù)能力的技術(shù)。關(guān)于修改java字節(jié)碼 文件的技術(shù),可以直接讀取java字節(jié)碼文件,然后對其進(jìn)行分析、修改。也可 以采用一些已有的操作java字節(jié)碼文件的技術(shù)。在下面的實(shí)施方式中,對java 字節(jié)碼文件的修改是采用類庫javassisit中所提供的方法對java字節(jié)碼文件進(jìn) 行修改的。在編寫自動處理程序前,先導(dǎo)入javassist. jar包,便可以利用其中 所提供的方法,并結(jié)合《通用的基于遞歸微重啟技術(shù)的快速自恢復(fù)方法》中所提 出的對可能產(chǎn)生異常的語句將其封裝成微重啟元素的方法,對java字節(jié)碼文件 進(jìn)行修改。其具體修改流程如下
a) 由輸入的Java字節(jié)碼文件的路徑名讀取Java字節(jié)碼文件,并檢査該Java 字節(jié)碼文件是否已經(jīng)被應(yīng)用本方法的當(dāng)前正在讀取該Java字節(jié)碼文件的 軟件產(chǎn)品修改過。如果已經(jīng)被修改過,則對該Java字節(jié)碼文件不再進(jìn)行 處理,否則,轉(zhuǎn)步驟k);
b) 獲取java字節(jié)碼文件中所有聲明的方法,并將方法的信息存入一個數(shù)組, 方法信息中包括取方法的方法名、返回值、異常表等信息;
c) 依次讀取數(shù)組中的每一個方法的信息,檢査當(dāng)前方法是否有由throws關(guān) 鍵字聲明拋出異常的信息。如果有,進(jìn)行步驟m p),否則,繼續(xù)檢查 數(shù)組中的下一個方法的信息,若讀到數(shù)組尾,轉(zhuǎn)步驟q);
d) 對由throws關(guān)鍵字聲明的可能拋出異常的方法(以下稱為原方法),獲取其方法名;
e) 將原方法重新命名;
f) 根據(jù)原方法的信息(包括其方法名、返回值、異常表等信息),創(chuàng)建新的 方法,并使用原方法的方法名作為新方法的方法名,原方法的返回值作 為新方法的返回值,原方法的異常表作為新方法的異常表(即新方法同 樣由throws關(guān)鍵字聲明拋出與原方法相同類型的異常);
g) 構(gòu)造新方法的方法體,在其方法體中調(diào)用原方法,并將調(diào)用語句封裝為 可微重啟元素。具體的封裝方法,應(yīng)用專利《通用的基于遞歸微重啟技 術(shù)的快速自恢復(fù)方法》中所提出的方法;
h) 向被處理的java字節(jié)碼文件中添加標(biāo)記,該標(biāo)記表明該java字節(jié)碼文件 已經(jīng)被該方法處理過,以使該軟件產(chǎn)品就不會對該文件進(jìn)行重復(fù)改進(jìn);
i) 將以上所作修改寫入java字節(jié)碼文件。 根據(jù)上述實(shí)施方式,用java語言所編寫的部分代碼如下 ClassPool pool = ClassPool. getDefault(); BufferedI叩utStream bis = new BufferedI叩utStream(
new FileI叩utStream(i叩utPath)); 〃獲取由路徑名給出的java字節(jié)碼文件 CtClass cc = pool. makeClass(bis);
〃ismodified:表示是否對獲得的.class文件已經(jīng)進(jìn)行過了處理
boolean ismodified = false;
.CtField[] ccf = cc. getFields();
for (int i = 0; i 〈 ccf. length; i++) {
if (ccf[i]. getName(). equals(〃isaddedblock〃)) {
ismodified = true;
break;
if (!ismodified) {〃逐次檢查類中各個方法,看是否會產(chǎn)生異常 for (int i = 0; i 〈 cm. length; i++) {
〃獲取方法中由throws聲明拋出的異常,并存入數(shù)組 CtClass etc[] = cm[i]. getExceptionTypes();
if (etc. length != 0) {
〃獲取可能產(chǎn)生異常的方法的方法名
String oldname 二 cm[i]. getName(). toString();
String cmname 二 oldname;
〃定義此方法將被改成的名字
String newname 二 oldname + 〃$impl〃;
〃將原方法重命名為newname
cm[i]. setName(newname);
//創(chuàng)建一個新的方法,方法名使用原方法名,為oldname CtMethod cmnew = CtNewMethod. copy(cm[i], oldname, cc, null);
〃獲取原方法的返回類型
String type 二 cm[i]. getReturnType(). getName(); // Jf々^t^J^i^力、^^];^、^^:水水承氺氺氺氺木氺氺氺氺承承氺承承
〃新方法中調(diào)用原方法,并將調(diào)用語句封裝為可微重啟元素 StringBuffer body = new StringBuffer(); body.鄰pend(" { \n"); ……〃向類文件中寫入微重啟代碼 body, append(" } \n"); cmnew.setBody(body. toString()); cc. addMethod(cmnew);
〃至!1此結(jié)束對新方法方法體的構(gòu)造*林林林*********** 〃對修改過的java字節(jié)碼文件添加標(biāo)記,表示已經(jīng)對其進(jìn)行過修改CtField cf 二 CtField. make ("public boolean isaddedblock 二 false;",
cc);
cc. addField(cf);
〃將改進(jìn)內(nèi)容寫入java字節(jié)碼文件
cc. writeFile ();
以上為采用本發(fā)明方法所編寫的程序的示例代碼。經(jīng)實(shí)驗(yàn)驗(yàn)證,只需給出需要修
改的Java字節(jié)碼文件所在的路徑,本方法就可以完成對該目錄下所有Java字節(jié) 碼文件的自動改進(jìn),并使由所改進(jìn)的Java字節(jié)碼文件所組成的系統(tǒng)具有可微重 啟的特性,從而使系統(tǒng)具有快速自恢復(fù)的能力。本方法的實(shí)施是對目標(biāo)系統(tǒng)的預(yù) 處理,附加微重啟機(jī)制在程序運(yùn)行時(shí)的開銷幾乎可以忽略,因此,使用本方法處 理目標(biāo)系統(tǒng)不會影響目標(biāo)系統(tǒng)的執(zhí)行并且只需付出很小代價(jià)。
權(quán)利要求
1、一種針對java字節(jié)碼文件的快速自動修改方法,其特征是a)根據(jù)輸入的java字節(jié)碼文件的路徑名讀取java字節(jié)碼文件,并檢查該java字節(jié)碼文件是否已經(jīng)被修改過,如果已被修改,則不再對該文件進(jìn)行處理,否則,轉(zhuǎn)步驟b);b)獲取java字節(jié)碼文件中所有聲明的方法,并將方法的信息存入一個數(shù)組,方法信息中包括方法的方法名、返回值、異常表信息,將遍歷指針置于數(shù)組起始位置;c)檢查數(shù)組中下一個方法信息,若其可能拋出異常,轉(zhuǎn)步驟d),否則,繼續(xù)檢查數(shù)組中的下一個方法,若讀到數(shù)組尾,轉(zhuǎn)步驟h);d)對可能拋出異常的方法的原方法,獲取其方法名;e)將原方法重新命名;f)根據(jù)原方法的信息,創(chuàng)建新的方法,并使用原方法的方法名作為新方法的方法名,原方法的返回值作為新方法的返回值,原方法的異常表作為新方法的異常表;g)構(gòu)造新方法的方法體,在其方法體中調(diào)用原方法,并將調(diào)用語句封裝為可微重啟元素,成功封裝后,轉(zhuǎn)步驟c);h)向被處理的java字節(jié)碼文件中添加標(biāo)記,該標(biāo)記表明該java字節(jié)碼文件已經(jīng)被該方法處理過,以避免對該java字節(jié)碼文件進(jìn)行重復(fù)改進(jìn);i)將以上所作修改寫入java字節(jié)碼文件。
2、 根據(jù)權(quán)利要求1所述的針對java字節(jié)碼文件的快速自動修改方法, 其特征是步驟a)中所述的路徑名為本地文件的絕對路徑名或網(wǎng)絡(luò)文件的 url地址。
3、 根據(jù)權(quán)利要求1或2所述的針對Java字節(jié)碼文件的快速自動修改 方法,其特征是步驟f)中所述的原方法的信息為其方法名、返回值、異 常表信息。
全文摘要
本發(fā)明提供的是一種針對java字節(jié)碼文件的快速自動修改方法。根據(jù)輸入的java字節(jié)碼文件的路徑名讀取java字節(jié)碼文件;獲取java字節(jié)碼文件中所有聲明的方法,并將方法的信息存入一個數(shù)組;檢查數(shù)組中下一個方法信息;對可能拋出異常的方法的原方法,獲取其方法名;將原方法重新命名;根據(jù)原方法的信息,創(chuàng)建新的方法;構(gòu)造新方法的方法體;向被處理的java字節(jié)碼文件中添加標(biāo)記;將以上所作修改寫入java字節(jié)碼文件。本發(fā)明所改進(jìn)的由java字節(jié)碼文件組成的系統(tǒng)具有很好的可微重啟特性;針對java字節(jié)碼文件進(jìn)行處理,不僅可以適用于無源文件的情況,同時(shí)節(jié)省了二次編譯的開銷;實(shí)現(xiàn)了自動處理的功能,可節(jié)省開發(fā)人員或代碼改進(jìn)人員的時(shí)間和精力。
文檔編號G06F11/36GK101566967SQ200910072170
公開日2009年10月28日 申請日期2009年6月3日 優(yōu)先權(quán)日2009年6月3日
發(fā)明者周曉耕, 王慧強(qiáng), 王海峰, 董璽坤 申請人:哈爾濱工程大學(xué)