вставить 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]

person Aura Lee    schedule 29.04.2016    source источник


Ответы (1)


Фрейм стека состоит из ряда локальных переменных и ряда значений в стеке операндов. То, что вы пытаетесь воспроизвести, по-видимому, является результатом преобразования этого состояния в удобочитаемую строку формы

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