Java字节码反向工程的另外的用途
在 http://soja.sourceforge.net/blog/2006/04/java.html 《针对Java开发规则引擎的一种优化》 一文中,我谈到了需要基于字节码分析技术来进行规则引擎的优化工作,实际上,字节码分析技术可能适用的范围会更为广泛,完全可以成为一种通用的底层技术, 从而在多个框架领域发挥重要的作用,这里列举一些应用的场景:
1、Profile。基于字节码分析技术,可以比较简单的在现有字节码中插入Profile用的代码,产生用于Profile的数据收集。
2、Code Coverage Tool。
3、Continuation Framework。基于字节码分析,我们可以重构一个方法,把这个方法变成一个等效的类,使用类变量来替代局部变量,从而实现Continuation的开发。下面是一个示例:
public void mailProcess(){
Mail mail = waitingEmail();
String txt = mail.getText();
if(txt == "Hello"){
Mail mail2 = waitingEmail();
}
}
==〉
Class mailProcess {
Mail mail, mail2;
String txt;
int status;
public void execute(){
switch(status){
case 1: goto l1;
case 2: goto l2;
}
mail = waitingEmail();
l1:String txt = mail.getText();
if(txt == "Hello"){
mail2 = waitingEmail();
l2:
}
}
}
在这里,waitingEmail这个方法会启动一个任务来接受邮件,同时方法抛出异常,自动的结束当前执行。当异步的任务处理接收到邮件时,将邮件的内 容保存到对象中,系统重新的从l1开时继续执行,通过这样一种字节码处理技术,即可简单的实现Continuation的功能。
4、针对log的优化,很多的java代码并没有使用 if(log.isDebugEnabled) log.debug(...) 模式来处理代码,通过字节码分析技术,我们可以对所有的 log.debug 调用自动的添加上上述的检查代码,从而使得代码可以具有更高的执行效率。这种模式可以认为是在字节码层面上的AOP。
总之,字节码分析技术可以让字节码本身成为一个可以操作的对象,而且是在更高的语义层面,从而使得开发人员进一步的从这些内容中解脱出来,提高软件的开发效率。