繁体   English   中英

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

[英]Bytecode manipulation - converting Bytecode representation to Java code representation

对于我的字节码分析项目,我正在使用ASM库来操作字节码。 在字节码级别,此方法在源代码中的声明:

void m(int i, String s)

表示为字符串:

(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您能指出我吗?

您可以使用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([^;]+);/

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM