与ASM

2016-04-29 94 views
1

插入FrameNode我怎么会插入字节代码framenode?与ASM

FRAME FULL [java/lang/String [C java/lang/String T I I [C] [] 

我的第一次尝试是:

mn.instructions.insertBefore(random, new FrameNode(Opcodes.F_FULL, 1 /**IDK**/, 
    new Object[]{ "java/lang/String", "[C", "java/lang/String", "T", "I", "I", "[C]" }, 
    1/**IDK**/, new Object[] { "[C]","[]" })); 

没有工作好。输出:

FRAME FULL [[java/lang/String] [java/lang/String] 

回答

3

堆栈帧由操作数堆栈上的许多局部变量和一些值组成。你试图重现,显然是国家的形式

FRAME FULL [list of local variables types] [list of operand stack time types]

你必须做的第一件事情的人类可读的字符串转换的结果,是从输出识别支架格式,这需要包含类型签名的理解,作为签名开始有开口托架等[C表示数组类型,即一个字符数组。换句话说,一些开括号是类型签名的一部分,其它的是输出格式的一部分,而右括号总是输出格式的一部分,并不会出现在类型签名。

然后,当你有两个组中标识的类型特征,提供局部变量和操作数栈中的项目适当的计数。在你的情况有:

FRAME FULL // frame type 
[   // start local variables 
    java/lang/String 
    [C 
    java/lang/String 
    T 
    I 
    I 
    [C 
] // seven local variables specified 
[ // start of operand stack 
] // empty operand stack 

但你必须开始思考意义类型项目,这是不幸的是没有源自打印输出,只是重现相同的打印输出并不一定意味着正确码。

即,项TI可以指具有全限定名TI,分别类,在这种情况下通过"T""I"FrameNode将是正确的。然而,它更可能是它们是指非类堆栈帧类型<顶部>int必须被称为在ASM使用预定义的常量Integer

new FrameNode(Opcodes.F_FULL, 7, new Object[] { 
    "java/lang/String", "[C", "java/lang/String", 
    Opcodes.TOP, Opcodes.INTEGER, Opcodes.INTEGER, "[C" }, 0, new Object[0]);