Как обернуть переменную методом в байт-код ASM JAVA
Я пытаюсь зашифровать переменную в параметре в вызове метода с использованием ASM при обходе инструкций в узле метода.
На данный момент я попытался сделать строку для шифрования в предыдущей строке вызова метода (в фактическом коде Java).
то есть. если строка Logger("Это журнал", а)
Мой алгоритм работает так: a = Project.Util.encode(a); в предыдущей строке регистратора. Пример кода приведен ниже.
if(abstractNode instanceof VarInsnNode) {
VarInsnNode varnode = (VarInsnNode) abstractNode;
insnList.add(new FieldInsnNode(GETSTATIC, "com/sample/Project", "Util", "Ljava/io/PrintStream;"));
insnList.add(new VarInsnNode(ALOAD,varnode.var));
insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/io/PrintStream", "encode", "(Ljava/lang/String;)Ljava/lang/String;"));
insnList.add(new VarInsnNode(ASTORE,varnode.var));
}
Я вычисляю параметры из описания вызова метода. Всякий раз, когда я нахожу переменную, я создаю кодировку, изменяя ее значение, и в конце байтовой структуры вызова метода (перемещаясь в восходящем направлении) я вставляю эти инструкции перед ними.
Но я хочу убрать его использование вот так. Вместо этого я хочу сделать так.
Logger("Это журнал", кодировать (а));
Представьте, что я попал в переменную a как абстрактный узел. Я пытаюсь добавить инструкцию до и после этой конкретной переменной, как.
methodNode.instructions.insertBefore(abstractNode, new FieldInsnNode(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"));
methodNode.instructions.insertBefore(abstractNode.getNext(),new MethodInsnNode(INVOKEVIRTUAL, "java/io/PrintStream", "encode", "(Ljava/lang/String;)Ljava/lang/String;"));
Получается, что сбой говорит "Нет достаточного места в стеке".
Пожалуйста, помогите мне в этом.