字节码操作-将字节码表示转换为Java代码表示
对于我的字节码分析项目,我使用ASM库来操作字节码。在字节码级别,源代码中的此方法声明:字节码操作-将字节码表示转换为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开头并以结尾的匹配项(要
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([^;]+)+/
非常好!!这就是我要找的。谢谢:)非常好!!这就是我要找的。谢谢:)