注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

获取java方法的参数名  

来自哎哟喂嘞   2012-04-14 22:24:46|  分类: 性能测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在做性能测试时,通过profile工具获取到hot spot以后,我们会想用btrace记录下特定方法的调用时间以及传入方法的参数值。
在btrace中想要获得方法的参数值,btrace脚本中对应方法必须带上与目标方法参数名一致的参数。这里就有个问题,怎么获取java类中方法的参数名呢?
当然你有源文件的话这完全不是问题,我们的前提是只有.class文件,一开始试了javap发现只能看到返回类型、方法名和参数类型,应该可以通过反射解决,又在网上搜索了一阵,终于发现有人说javassist这个第三方包可以实现,了解了api就开工

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;

public class RefectParamName {

public static void main(String[] args) {
try {
ClassPool pool = ClassPool.getDefault();
pool.appendClassPath(args[0]);
CtClass cc = pool.get(args[1]);
CtMethod[] cms = cc.getDeclaredMethods();

for (CtMethod cm : cms) {
System.out.println("--------------------");
System.out.println(cm.getName());
MethodInfo methodInfo = cm.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute
.getAttribute(LocalVariableAttribute.tag);
if (attr == null) {
System.err.println("attr is null");

continue;
}
String[] paramNames = new String[cm.getParameterTypes().length];
int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
for (int i = 0; i < paramNames.length; i++)
paramNames[i] = attr.variableName(i + pos);
for (int i = 0; i < paramNames.length; i++) {
System.out.println(i + ": " + paramNames[i]);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

得到了方法的参数名,就可以通过btrace得到该方法调用时传入的参数值了
  评论这张
 
阅读(1813)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016