获取java方法的参数名

在做性能测试时,通过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得到该方法调用时传入的参数值了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值