随笔-204  评论-149  文章-0  trackbacks-0

假如现有两个API,AIPa,和APIb,两个api定义的类,接口,功能均完全相同,但是有写细微差别,比如说方法的参数类型不同,方法的返回值不同等等。
比如APIa中一个类A的方法为public int add(String a,String b)
比如APIb中的一个类A的方法为 public int add(int a,int b)

之前有一程序是使用APIa编写的(现在只提供此程序的 class文件,不提供程序的源代码,不允许修改程序的源代码),现在要使这个程序能够在APIb下能够使用??

方法一不修改APIb的classes文件,而是修改应用程序的classes文件,将扫描原始应用程序的class文件,将class文件中用到APIa的方法转换成APIb的方法??,这个应该不叫转换,比如在程序中调用a.add("1","2")时,在方法调用前将方法栈中的字符串参数转换成数字,使用javassist怎么来做,使用bcel怎么来做??

方法二不修改应用程序的classes文件,而是修改APIb的classes文件,是将APIb的接口形式转换为APIa的形式,使用javassist重写APIb的方法,对APIb的所有方法进行包装成APIa的方法,然后使用重写的APIb的classes文件来允许程序。这个使用javassist应该比较方便,使用becl?
这个就有点不方便了,如果APIb的类库比较大的话,API间不一致的地方也比较多的话,都需要自己重写,相当于重新包装了这个APIb,需要修改APIb的classes文件,有可能其他程序要用到这个APIb。

还不太清楚,在仔细想想怎么来做,接下来的工作自己写两套简单的API,然后试验试验。
刚开始想的是使用方法二来做,好像这个不太现实,应该是程序使用到了哪个方法,就对这个方法来进行修改,还是方法一好点。
再好好看看java虚拟机规范。。。

这个只是一个简单问题的提出,而我实际要转换的程序要比这个复杂,但是基本原理就这了。
tmd,花了一天多把java虚拟机规范看了好几章,我都佩服自己的学习能力,他妈的为什么就找不到实习了?

posted on 2009-08-12 12:16 Frank_Fang 阅读(415) 评论(0)  编辑  收藏 所属分类: bcel javassist

只有注册用户登录后才能发表评论。


网站导航: