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