首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字节码操作-将字节码表示转换为Java代码表示

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

Stack Overflow用户
提问于 2013-11-06 06:34:40
回答 2查看 410关注 0票数 0

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

代码语言:javascript
运行
复制
void m(int i, String s)

表示为字符串:

代码语言:javascript
运行
复制
(ILjava/lang/String;)[I
     |__ Parameters   |__ Return type 

在这里,我使用字符串操作技术从该字符串中提取参数。我需要在另一个字符串数组中获得这样的输出:(这样我就可以将字节代码表示转换成相应的Java表示):

代码语言:javascript
运行
复制
{I,Ljava/lang/String;}

为此,我尝试使用regex提取以L开头、以;结尾的所有匹配(获取以Ljava/lang/String形式出现的字符串;其他我可以管理的字符串):

代码语言:javascript
运行
复制
/\L([^L;]+)\;/

但它没有还给我任何火柴。我的问题是:

  • 有人能帮我纠正上面的规则吗?
  • 或者更好的情况是,如果有人从事过这类操作,那么如果有任何API可用于转换Bytecode representations --> Java code representations,您可以指出我吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-06 08:00:43

您可以使用method desc阅读org.objectweb.asm.Type

代码语言:javascript
运行
复制
    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());

输出

代码语言:javascript
运行
复制
int
java.lang.String
int[]
票数 4
EN

Stack Overflow用户

发布于 2013-11-06 06:39:39

至于regexp,这应该可以做到这一点(参数类型在之后的第一个捕获组中,整个匹配也匹配L和;)

/L([^;]+);/

下面是一个应该与返回类型相匹配的字符串(如果字符串在返回类型之后结束).如果你遗漏了什么,告诉我):

/\)\[(.+)$/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19805599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档