<b>用BCEL筹划字节码 - 直接在办法的调用处增添办法</b>[Java编程]
本文“<b>用BCEL筹划字节码 - 直接在办法的调用处增添办法</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
这个最接近之前提出的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");
}
}
以上是“<b>用BCEL筹划字节码 - 直接在办法的调用处增添办法</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |