对于我的字节码分析项目,我使用ASM库来操作字节码。在字节码级别,这个方法声明在源代码中:
void m(int i, String s)
表示为String:
(ILjava/lang/String;)[I
|__ Parameters |__ Return type
这里我使用字符串操作技术从String中提取参数。我需要在另一个String数组中得到这样的输出:(这样我就可以将字节代码表示转换为相应的Java表示):
{I,Ljava/lang/String;}
为此,我尝试了以下正则表达式来提取所有以L
开头并以;
结尾的匹配(以获取Ljava / lang / String形式的字符串;其他我可以管理):
/\L([^L;]+)\;/
但它没有给我任何比赛。我的问题是:
Bytecode representations --> Java code representations
?答案 0 :(得分:4)
您可以使用method desc
org.objectweb.asm.Type
String desc = "(ILjava/lang/String;)[I";
// params
for(Type type : Type.getArgumentTypes(desc)){
System.out.println(type.getClassName());
}
//return type
System.out.println(Type.getReturnType(desc).getClassName());
输出
int
java.lang.String
int[]
答案 1 :(得分:1)
至于正则表达式,这应该是技巧(参数类型在之后的第一个捕获组中,整个匹配确实匹配L和;)
/L([^;]+);/
这里应该匹配返回类型(如果字符串在返回类型后结束...如果你省略了某些东西,请告诉我):
/\)\[(.+)$/