快速业务通道

用BCEL设计字节码 - 直接在方法的调用处添加方法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20

用BCEL设计字节码 - 直接在方法的调用处添加方法

时间:2011-01-19 BlogJava Frank_Fang

这个最接近之前提出的API转换问题

这个需要扫描源代码找到此类的方法调用处,然后在方法调用处的前后添加指令

即将代码转换成如下形式:

public class StringBuilder {      public String buildString(int length) {          String result = "";          for (int i = 0; i < length; i++) {              result += (char)(i%26 + ''a'');          }          return result;      }      public static void main(String[] argv) {          StringBuilder inst = new StringBuilder();          for (int i = 0; i < argv.length; i++) {              long start = System.currentTimeMillis();              String result = inst.buildString(Integer.parseInt(argv[i]));              System.out.println("Call to buildString$impl took " +                      (System.currentTimeMillis()-start) + " ms.");              System.out.println("Constructed string of length " +                  result.length());          }      } }

转换代码如下:

先扫描这个类中的各个方法

我准备改变一下生成策略,不自己写指令了,这个自己写指令比较麻烦,但要加的代码比较多时比较容易出错,当所加的代码有if,跳转语句,自己根本就不会如何写添哪些指令,这种写类似汇编指令总是很麻烦的。

先要把加的代码自己在某个类中事先用方法写好,实例方法也好,静态方法也好,方法带有参数或者有返回值,

这些参数和返回值供调用方法中的局部变量来替换和使用。

再要添加代码的方法的前后调用这些已经写好的方法的字节码的指令序列生成InstructionList,然后再添加到使用这个方法的指令序列中

如下

public class ToolUtil {      public static long printStart() {          System.out.println("start start start start");          long start = System.currentTimeMillis();          return start;      }      public static void printEnd(String methodname,long start){          System.out.println("Call to "+methodname+" took " +                  (System.currentTimeMillis()-start) + " ms.");          System.out.println("end end end end end end");      } }

喘BCEL譜柴忖准鷹 - 岷俊壓圭隈議距喘侃耶紗圭隈(2)

扮寂:2011-01-19 BlogJava Frank_Fang

圻兵議圭隈

public class StringBuilder {      /**//*       * 勣壓距喘阻緩圭隈議圭隈議旗鷹議念朔耶紗旗鷹       */      public String buildString(int length) {          String result = "";          for (int i = 0; i < length; i++) {              result += (char) (i % 26 + ''a'');          }          System.out.println(result);          return result;      }      /**//*       * 距喘阻buildString

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号