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



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

这是一个应该与返回类型匹配的(如果字符串在返回类型之后结束......如果您遗漏了某些内容,请告诉我):
/)[(.+)$/

最新更新