Фрейм стека состоит из ряда локальных переменных и ряда значений в стеке операндов. То, что вы пытаетесь воспроизвести, по-видимому, является результатом преобразования этого состояния в удобочитаемую строку формы
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
Но тогда вы должны начать думать о значении элементов типа, которое, к сожалению, не может быть получено из вывода на печать, а простое воспроизведение того же вывода не обязательно подразумевает правильный код.
А именно, элементы T
и I
могут относиться к классам с полными именами T
и I
соответственно, и в этом случае передача "T"
и "I"
в FrameNode
будет правильной. Однако более вероятно, что они относятся к типам кадров стека, не относящимся к классу, ‹top› и int
, на которые следует ссылаться с помощью предопределенных констант Integer
в ASM:
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]);
person
Holger
schedule
29.04.2016