如何使用 org.objectweb.asm.MethodVisitor 获取方法参数的数量和类型?

How to get count and types of method parameters using org.objectweb.asm.MethodVisitor?

我正在尝试使用 asm MethodVisitor 从 Java class 字节码中提取方法参数信息。未调用 MethodVisitorvisitParameter 方法(因为已编译的 class 文件中没有参数名称)。如何获取方法参数及其类型的数量?

目前我唯一发现的是 MethodVisitorvisitMethoddesc 参数。我可以从 asm-util 复制粘贴 TraceSignatureVisitor class,重写大约 50 行代码以将参数声明存储到 List/array 而不是单个 StringBuffer.

答案“

The number of arguments to the method can be computed from the method description using the code in the following gist: https://gist.github.com/VijayKrishna/6160036. Using the parseMethodArguments(String desc) method you can easily compute the number of arguments to the method.

我个人认为复制粘贴重写TraceSignatureVisitor还是比较好

但我想 应该 更简单的方法来处理 asm-util 中的方法签名。有吗?

ASM 有一个用于此目的的摘要,Type

Type 的实例可能表示原始类型、引用类型或方法类型。因此,您可以先从描述符字符串中获取表示方法类型的类型,然后查询参数类型和 return 类型。

String desc = "(Ljava/lang/String;I[[ZJ)D";

Type methodType = Type.getMethodType(desc);
int sizes = methodType.getArgumentsAndReturnSizes();
System.out.println("return type: "
    + methodType.getReturnType().getClassName() + " (" +(sizes & 3) + ')');

Type[] argTypes = methodType.getArgumentTypes();
System.out.println(argTypes.length + " arguments (" + (sizes >> 2) + ')');
for (int ix = 0; ix < argTypes.length; ix++) {
    System.out.println("arg" + ix + ": " + argTypes[ix].getClassName());
}

getArgumentsAndReturnSizes() 编辑的大小 return 指的是局部变量和操作数堆栈条目,其中 longdouble 算作两个。它还考虑了隐含的 this 参数,这对于实例方法很方便,但需要调用者为 static 方法减去一个。

示例打印

return type: double (2)
4 arguments (6)
arg0: java.lang.String
arg1: int
arg2: boolean[][]
arg3: long

如果您只对其中一项功能感兴趣,可以使用 Type class.

的静态方法之一直接获取它
int sizes = Type.getArgumentsAndReturnSizes(desc);
Type ret = Type.getReturnType(desc);
Type[] argTypes = Type.getArgumentTypes(desc);