Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字节码操作-将字节码表示转换为Java代码表示_Java_Regex_Java Bytecode Asm - Fatal编程技术网

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

字节码操作-将字节码表示转换为Java代码表示,java,regex,java-bytecode-asm,Java,Regex,Java Bytecode Asm,对于我的字节码分析项目,我使用ASM库来操作字节码。在字节码级别,源代码中的此方法声明: void m(int i, String s) 表示为字符串: (ILjava/lang/String;)[I |__ Parameters |__ Return type 在这里,我使用字符串操作技术从该字符串中提取参数。我需要在另一个字符串数组中获得如下输出:(这样我就可以将字节码表示形式转换为相应的Java表示形式): 为此,我尝试按照正则表达式提取所有以L开头并以结尾的匹配项(要

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

void m(int i, String s)
表示为字符串:

(ILjava/lang/String;)[I
     |__ Parameters   |__ Return type 
在这里,我使用字符串操作技术从该字符串中提取参数。我需要在另一个字符串数组中获得如下输出:(这样我就可以将字节码表示形式转换为相应的Java表示形式):

为此,我尝试按照正则表达式提取所有以
L
开头并以
结尾的匹配项(要获取Ljava/lang/String;格式的字符串,我可以管理其他字符串):

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

  • 有人能帮我纠正上面的正则表达式吗
  • 或者更好,如果有人研究过这些类型的操作,您能告诉我是否有任何API可用于转换
    字节码表示-->Java代码表示

对于regexp,这应该会起作用(参数类型在之后的第一个捕获组中,整个匹配也会匹配L和;)
/L([^;]+)/

这里有一个应该与返回类型匹配的字符串(如果字符串在返回类型之后结束……如果您遗漏了什么,请告诉我):

/\)\[(.+)$/
对于regexp,这应该会起作用(参数类型在之后的第一个捕获组中,整个匹配也会匹配L和;)
/L([^;]+);/

这里有一个应该与返回类型匹配的字符串(如果字符串在返回类型之后结束……如果您遗漏了什么,请告诉我):

/\)\[(.+)$/
您可以使用
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[]

您可以使用
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[]

如果从regexp中删除两个反斜杠,会发生什么情况?噢,Java regexp通常也不使用正斜杠;至少不像Javascript那样。它不再匹配了。@davidwallaceletly?除了一个额外的“L”(你没有任何L),这正是Johannes的解决方案告诉你要做的。为什么当他告诉你去做的时候它会起作用,而当我告诉你去做的时候它就不起作用了?@DavidWallace:根据他实际的搜索方式,额外的L可能会有所不同:如果他匹配不区分大小写(没有理由这么做,但这是可能的),lang中的l在第一个捕获组中结束捕获。因为没有;之后,整个匹配失败。对于包含“l”的类名,甚至对于区分大小写的匹配也是如此。@JohannesH。它总是
L
,而不是
L
,如果从regexp中删除两个反斜杠会发生什么?哦,Java regexp通常也不使用前斜杠;至少不像Javascript那样。它不再匹配了。@davidwallaly?除了一个额外的“L”(无论如何,你都没有),这正是约翰内斯的解决方案告诉你要做的。为什么当他告诉你要做的时候它起作用了,而当我告诉你要做的时候它就不起作用了?@DavidWallace:根据他实际做搜索的方式,额外的L可能会有所不同:如果他匹配不区分大小写(没有理由这样做,但这是可能的),lang中的l确实在第一个捕获组中结束捕获。因为没有;之后,整个匹配失败。对于包含“l”的类名,甚至对于区分大小写的匹配也是如此。@JohannesH。它将始终是
L
而不是
L
这两个看起来都不错,工作正常。让我等待问题其他部分的答案,如果不是,我将接受此答案:)请注意,第一个regexp只匹配一种参数类型。如果有多个参数,您必须将其更改为类似的类型(每个参数现在都有自己的捕获组):
/L([^;]+)+/
这两个参数看起来都不错,工作正常。让我等待问题其他部分的答案,如果没有,我将接受此答案:)请注意,第一个regexp只匹配一种参数类型。如果有多个参数,您必须将其更改为类似的类型(每个参数现在都有自己的捕获组):
/L([^;]+)+/
非常好!!这就是我要找的。谢谢:)非常好!!这就是我要找的。谢谢:)