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