Я работаю над инструментом, который использует 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
Манипулирование байт-кодом Java с использованием asm [закрыто] ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение