字节码操作 - 将字节码表示转换为Java代码表示

时间:2013-11-06 06:34:41

标签: java regex java-bytecode-asm

对于我的字节码分析项目,我使用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;]+)\;/

但它没有给我任何比赛。我的问题是:

  • 有人可以帮我纠正上面的正则表达式吗?
  • 或者更好的是,如果有人参与过这些类型的操作,您是否可以指出我是否有任何API可用于转换Bytecode representations --> Java code representations

2 个答案:

答案 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([^;]+);/

这里应该匹配返回类型(如果字符串在返回类型后结束...如果你省略了某些东西,请告诉我):
/\)\[(.+)$/