vls*_*gey 0 java java-bytecode-asm
我正在尝试使用 asm 从 Java 类字节码中提取方法参数信息MethodVisitor。visitParameter的方法MethodVisitor未被调用(因为编译后的类文件中不存在参数名称)。如何获取方法参数及其类型的计数?
到目前为止我发现的唯一的就是fromdesc的参数。我可以从 asm-util 复制粘贴类,重写大约 50 行代码以将参数声明存储到 List/array 而不是单个。visitMethodMethodVisitorTraceSignatureVisitorStringBuffer
答案“/sf/ask/1264311191/”中建议了另一种选择:
可以使用以下要点中的代码根据方法描述来计算该方法的参数数量:https: //gist.github.com/VijayKrishna/6160036。使用该
parseMethodArguments(String desc)方法,您可以轻松计算该方法的参数数量。
从我的角度来看,复制粘贴和重写TraceSignatureVisitor还是更好。
但我认为应该有更简单的方法来处理 asm-util 中的方法签名。有没有?
ASM 有一个用于此目的的摘要,Type.
的实例Type可以表示原始类型、引用类型或方法类型。因此,您可以首先从描述符字符串中获取表示方法类型的类型,然后查询它的参数类型和返回类型。
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());
}
Run Code Online (Sandbox Code Playgroud)
返回的大小getArgumentsAndReturnSizes()参考局部变量和操作数堆栈条目,其中long和double计为 2。它还考虑了隐含this参数,这对于实例方法来说很方便,但要求调用者为static方法减一。
示例打印
return type: double (2)
4 arguments (6)
arg0: java.lang.String
arg1: int
arg2: boolean[][]
arg3: long
Run Code Online (Sandbox Code Playgroud)
如果您只对其中一项功能感兴趣,则可以使用该类的静态方法之一直接获取它Type。
int sizes = Type.getArgumentsAndReturnSizes(desc);
Type ret = Type.getReturnType(desc);
Type[] argTypes = Type.getArgumentTypes(desc);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |