0

对于我的字节码分析项目,我使用 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吗?
4

2 回答 2

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[]
于 2013-11-06T08:00:43.283 回答
1

至于正则表达式,这应该可以解决问题(参数类型在之后的第一个捕获组中,整个匹配也匹配 L 和 ;)
/L([^;]+);/

这里有一个应该匹配返回类型(如果字符串在返回类型之后结束......如果你遗漏了一些东西,告诉我):
/\)\[(.+)$/

于 2013-11-06T06:39:39.060 回答