代码插桩是测试和定位问题的常用手段,通过在代码对应位置插入相应的代码(“桩”),来打印或收集我们所需要的数据。
自动化插桩,也就是在代码的特定位置,自动的插入我们需要的一行或几行代码。通常我们会在编译后的代码上进行插桩,这样做好处就是避免了对源码的侵入,一定程度上屏蔽了开发者不同的代码风格。这里,我们主要介绍另一种在源码上插桩的方式,如果不考虑对代码的侵入性,那么在源码上直接插桩会更加直观,也就更加容易把控和调试,具有更高的灵活性,而且本文将要介绍的这种方法也无须考虑不同的代码风格。
插桩需求
以一段结构比较简单的Java代码为例,假设我们有一个后缀名为".java"的源码文件,需要在里面的每个方法的开头插入一行代码打印当前方法的名字,在代码执行时,让我们能够知道哪个方法被调用过,以便绘制整个工程的调用关系图。文件中的源码如下:
package com.ast.pkg;
public class ASTDemo {
int intData = 0;
double floatData = 0;
String strData = "";
//construction
public ASTDemo() {
this.intData = 123;
this.floatData = 3.14;
this.strData = "It's been a long time.";
}
public void setIntData(int data) {
this.intData = data;
}
public String getStrData() {
return this.strData;
}
public void methodDemo(String param1, String param2) {
if (null == param1 || null == param2) {
return;
}
if (param1.length() > param2.length()) {
strData = strData + param1;
} else {
strData = strData + param2;
}
}
}
亲爱的小伙伴们,有需要java面试文档资料的请点赞收藏和转发哦,关注我之后点进我的主页右上角私信(555)即刻领取免费资料哦或点击:https://shimo.im/docs/aBAYVxlBX6IDge3j
显然,我们不可能直接插桩,因为那样即便是你能准确的定位到每个方法的第一行,仍然不具有通用性,同样的代码换一个写法,或者增加一些复杂的代码结构,再或者换个书写习惯,不仅无法识别代码第一行,即便是再开发,也非常复杂。接下来我们换个思