如何使用 org.objectweb.asm.MethodVisitor 获取方法参数的数量和类型?
How to get count and types of method parameters using org.objectweb.asm.MethodVisitor?
我正在尝试使用 asm MethodVisitor
从 Java class 字节码中提取方法参数信息。未调用 MethodVisitor
的 visitParameter
方法(因为已编译的 class 文件中没有参数名称)。如何获取方法参数及其类型的数量?
目前我唯一发现的是 MethodVisitor
中 visitMethod
的 desc
参数。我可以从 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 指的是局部变量和操作数堆栈条目,其中 long
和 double
算作两个。它还考虑了隐含的 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);
我正在尝试使用 asm MethodVisitor
从 Java class 字节码中提取方法参数信息。未调用 MethodVisitor
的 visitParameter
方法(因为已编译的 class 文件中没有参数名称)。如何获取方法参数及其类型的数量?
目前我唯一发现的是 MethodVisitor
中 visitMethod
的 desc
参数。我可以从 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 指的是局部变量和操作数堆栈条目,其中 long
和 double
算作两个。它还考虑了隐含的 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);