Манипулирование байт-кодом Java с использованием asm [закрыто]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Манипулирование байт-кодом Java с использованием asm [закрыто]

Сообщение Anonymous »

Я работаю над инструментом, который использует ASM для внедрения кода в метод onEnable плагинов Minecraft. В частности, я пытаюсь добавить оператор печати (System.out.println("Hello, World");) в начало метода onEnable. Однако внедрение, похоже, не работает должным образом, и я застрял.
После просмотра измененного файла .jar внедренный код отсутствует в методе onEnable. . Я добавил отладку и автоматическую проверку, и единственная обнаруженная проблема заключается в том, что внедренный байт-код не применяется к полученному .jar.
Ожидаемое поведение:
После внедрения метод onEnable должен содержать следующий код:
System.out.println("Hello, World");
Вот соответствующая часть моего код:

private byte[] modifyClassBytecode(InputStream classInputStream) throws IOException {
ClassReader classReader = new ClassReader(classInputStream);
ClassNode classNode = new ClassNode();
classReader.accept(classNode, 0);

boolean methodFound = false;

for (MethodNode method : classNode.methods) {
if ("onEnable".equals(method.name) && "()V".equals(method.desc)) {
methodFound = true;
System.out.println("Found 'onEnable' method. Injecting code...");

// Create the instructions to inject
InsnList insnList = new InsnList();
insnList.add(new FieldInsnNode(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"));
insnList.add(new LdcInsnNode("Hello, world"));
insnList.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false));

// Inject at the beginning of the method
method.instructions.insert(insnList);
System.out.println("Injection complete.");
break;
}
}

if (!methodFound) {
throw new IOException("The `onEnable` method was not found in the class.");
}

// Write the modified class back to a byte array
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
classNode.accept(classWriter);
return classWriter.toByteArray();
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... -using-asm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»