对于我的字节码分析项目,我正在使用ASM库来操作字节码。在字节码级别,源代码中的此方法声明:
void m(int i, String s)
表示为字符串:
(ILjava/lang/String;)[I
|__ Parameters |__ Return type
在这里,我使用字符串操作技术从该字符串中提取参数。我需要在另一个字符串数组中获取这样的输出:(以便我可以将字节码表示转换为相应的 Java 表示):
{I,Ljava/lang/String;}
为此,我尝试按照正则表达式提取所有以 L
开头并以 ;
结尾的匹配项(以获取 Ljava/lang/String 形式的字符串;,其他我可以管理):
/L([^L;]+);/
但它并没有给我任何比赛。我的问题是:
- 谁能帮我纠正上述正则表达式?
- 或者更好的是,如果有人从事过这些类型的操作,您能否指出我是否有任何 API 可用于转换
Bytecode representations --> Java code representations
?
org.objectweb.asm.Type
阅读method desc
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[]
至于正则表达式,这应该可以解决问题(参数类型在之后的第一个捕获组中,整个匹配确实匹配 L 和 ;)
/L([^;]+);/
这是一个应该与返回类型匹配的(如果字符串在返回类型之后结束......如果您遗漏了某些内容,请告诉我):
/)[(.+)$/