與ASM

2016-04-29 130 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]);