隨筆-204  評論-149  文章-0  trackbacks-0

          假如現(xiàn)有兩個(gè)API,AIPa,和APIb,兩個(gè)api定義的類,接口,功能均完全相同,但是有寫細(xì)微差別,比如說方法的參數(shù)類型不同,方法的返回值不同等等。
          比如APIa中一個(gè)類A的方法為public int add(String a,String b)
          比如APIb中的一個(gè)類A的方法為 public int add(int a,int b)

          之前有一程序是使用APIa編寫的(現(xiàn)在只提供此程序的 class文件,不提供程序的源代碼,不允許修改程序的源代碼),現(xiàn)在要使這個(gè)程序能夠在APIb下能夠使用??

          方法一不修改APIb的classes文件,而是修改應(yīng)用程序的classes文件,將掃描原始應(yīng)用程序的class文件,將class文件中用到APIa的方法轉(zhuǎn)換成APIb的方法??,這個(gè)應(yīng)該不叫轉(zhuǎn)換,比如在程序中調(diào)用a.add("1","2")時(shí),在方法調(diào)用前將方法棧中的字符串參數(shù)轉(zhuǎn)換成數(shù)字,使用javassist怎么來做,使用bcel怎么來做??

          方法二不修改應(yīng)用程序的classes文件,而是修改APIb的classes文件,是將APIb的接口形式轉(zhuǎn)換為APIa的形式,使用javassist重寫APIb的方法,對APIb的所有方法進(jìn)行包裝成APIa的方法,然后使用重寫的APIb的classes文件來允許程序。這個(gè)使用javassist應(yīng)該比較方便,使用becl?
          這個(gè)就有點(diǎn)不方便了,如果APIb的類庫比較大的話,API間不一致的地方也比較多的話,都需要自己重寫,相當(dāng)于重新包裝了這個(gè)APIb,需要修改APIb的classes文件,有可能其他程序要用到這個(gè)APIb。

          還不太清楚,在仔細(xì)想想怎么來做,接下來的工作自己寫兩套簡單的API,然后試驗(yàn)試驗(yàn)。
          剛開始想的是使用方法二來做,好像這個(gè)不太現(xiàn)實(shí),應(yīng)該是程序使用到了哪個(gè)方法,就對這個(gè)方法來進(jìn)行修改,還是方法一好點(diǎn)。
          再好好看看java虛擬機(jī)規(guī)范。。。

          這個(gè)只是一個(gè)簡單問題的提出,而我實(shí)際要轉(zhuǎn)換的程序要比這個(gè)復(fù)雜,但是基本原理就這了。
          tmd,花了一天多把java虛擬機(jī)規(guī)范看了好幾章,我都佩服自己的學(xué)習(xí)能力,他媽的為什么就找不到實(shí)習(xí)了?

          posted on 2009-08-12 12:16 Frank_Fang 閱讀(442) 評論(0)  編輯  收藏 所屬分類: bcel javassist
          主站蜘蛛池模板: 犍为县| 蓝田县| 旌德县| 南宁市| 逊克县| 康定县| 宁强县| 西贡区| 安达市| 邹平县| 沐川县| 东莞市| 江安县| 衡山县| 通许县| 城口县| 大新县| 临朐县| 南城县| 安阳市| 大余县| 稷山县| 纳雍县| 新干县| 青河县| 年辖:市辖区| 松桃| 曲水县| 远安县| 墨玉县| 荔波县| 桦南县| 黄石市| 区。| 黄浦区| 秭归县| 井研县| 临汾市| 牡丹江市| 金乡县| 陆丰市|