Java ASM java.lang.NoSuchMethodError

Я новичок в Java ASM. Я пытаюсь использовать методы с использованием агента Java и ASM. Но я получаю сообщение об ошибке, как показано ниже:

Exception in thread "main" java.lang.NoSuchMethodError: java.io.FileOutputStream$1.<init>(Ljava/io/FileOutputStream;)V
    at java.io.FileOutputStream.close(FileOutputStream.java:354)
    at sun.nio.cs.StreamEncoder.implClose(StreamEncoder.java:320)
    at sun.nio.cs.StreamEncoder.close(StreamEncoder.java:149)
    at java.io.OutputStreamWriter.close(OutputStreamWriter.java:233)
    at WriteToFileExample.useFileWriter(WriteToFileExample.java:60)
    at WriteToFileExample.main(WriteToFileExample.java:30)

Я использую asm-6.0.

Я попытался написать простой тестовый код, и он работает. Но для некоторых методов в некоторых классах это не работает. Я не понимаю почему! ClassVisitor посещает класс, а затем для всех методов принимает MethodVisitor. Если в классе нет такого метода, как он принимает посетителя и почему выдает исключение?


person Seemanta Saha    schedule 10.11.2017    source источник
comment
Посетители вызываются в соответствии с исходным кодом, до внесения вами изменений, нарушающих код.   -  person Holger    schedule 10.11.2017
comment
да. Ты прав. Я знаю, что посетители вызываются по тестовому коду. Но метод, который, по его словам, не может быть найден, является методом из класса, который он получает на основе тестового кода. Тогда почему нет такого метода?   -  person Seemanta Saha    schedule 10.11.2017
comment
Я понятия не имею, что означает фраза «метод, который, по его словам, не может быть найден, является методом из класса, который он получает на основе тестового кода». Я начинаю задаваться вопросом, о чем вы думаете, а) какой метод не был найден и б) какой метод содержит/вызывает ошибку…   -  person Holger    schedule 13.11.2017
comment
Думаю, я понял это. FileOutputStream$1 — это внутренний класс FileOutputStram. Используя java-агент, я не получал информацию о FileOutputStream, а получал информацию о FileOutputStream$1. Но при посещении метода он говорит, что такой метод не найден для инициализации, потому что в FileOutputStream$1 нет метода инициализации. Метод Init находится в FileOutputStream. Я изменил код агента java, чтобы он имел дело не с внутренним классом, а с фактическим классом FileOutputStream, и теперь все в порядке.   -  person Seemanta Saha    schedule 14.11.2017
comment
имя <init> обозначает конструктор. Конечно, у оба класса есть конструкторы. В случае анонимного класса это конструктор, сгенерированный компилятором. Поскольку код работает для всех остальных, ваш агент должен изменить класс.   -  person Holger    schedule 14.11.2017


Ответы (1)


Я понял это. FileOutputStream$1 — это внутренний класс FileOutputStram. Используя java-агент, я не получал информацию о FileOutputStream, а получал информацию о FileOutputStream$1. Но при посещении метода он говорит, что такой метод с именем init не найден, а также для некоторых других методов, поскольку в FileOutputStream$1 нет метода init. Метод Init находится в FileOutputStream. Я изменил код агента java, чтобы он имел дело не с внутренним классом, а с фактическим классом FileOutputStream, и теперь все в порядке.

person Seemanta Saha    schedule 14.11.2017