对于我的字节码分析项目,我使用ASM库来操作字节码。在字节码级别,源代码中的此方法声明:
void m(int i, String s)
表示为字符串:
(ILjava/lang/String;)[I
|__ Parameters |__ Return type
在这里,我使用字符串操作技术从该字符串中提取参数。我需要在另一个字符串数组中获得这样的输出:(这样我就可以将字节代码表示转换成相应的Java表示):
{I,Ljava/lang/String;}
为此,我尝试使用regex提取以L
开头、以;
结尾的所有匹配(获取以Ljava/lang/String形式出现的字符串;其他我可以管理的字符串):
/\L([^L;]+)\;/
但它没有还给我任何火柴。我的问题是:
Bytecode representations --> Java code representations
,您可以指出我吗?发布于 2013-11-06 08:00:43
您可以使用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[]
发布于 2013-11-06 06:39:39
至于regexp,这应该可以做到这一点(参数类型在之后的第一个捕获组中,整个匹配也匹配L和;)
/L([^;]+);/
下面是一个应该与返回类型相匹配的字符串(如果字符串在返回类型之后结束).如果你遗漏了什么,告诉我):
/\)\[(.+)$/
https://stackoverflow.com/questions/19805599
复制相似问题