Java манипулирование байт-кодом без внешней библиотеки - PullRequest
0 голосов
/ 07 октября 2018

Такие библиотеки, как ASM, BCEL, Javaassist и AspectJ, способны манипулировать байт-кодом во время выполнения, но как они этого достигают?

Я уже делал некоторые базовые манипуляции с байт-кодом с использованием ASM, но я не понимаю, как это работает.Выполняется ли Java-агент в JVM до остальной части программы, что позволяет ASM загружать скомпилированные классы и редактировать их до того, как они будут выполнены JVM?

Если это так, можно ли выполнить байт-код javaманипулирование без использования внешней библиотеки, такой как ASM, загрузка скомпилированных файлов классов с помощью BufferedReader, написание пользовательского анализатора и т. д., например?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Эти библиотеки основаны на стандартных API Java, которые, конечно, вы также можете использовать самостоятельно без этих библиотек.

Прежде всего, файлы классов Java - это просто последовательности байтов в четко определенном формате, как указанов JVMS §4, Формат файла класса .Основная задача упомянутых библиотек - предоставить инструменты для обработки байтовых последовательностей в этом формате.Второе - получение определений существующих или экспортных модифицированных или вновь созданных классов.

Существует два разных способа решения второй задачи.Один из них - читать скомпилированные классы из постоянного хранилища, такого как файловые системы или файлы JAR и т. Д., И записывать их обратно в это хранилище, пока не выполняется конкретный код, как это делают инструменты сборки и развертывания.Это должно быть тривиально, поскольку сводится только к чтению и записи байтов.

Другой способ - манипулировать классами во время выполнения, что может быть выполнено агентами Java через API-интерфейс Instrumentation .Он предлагает механизмы для перехвата классов во время загрузки / определения перед их первым использованием, а также переопределение классов.Последний не может изменять их свободно, в настоящее время он должен сохранять все объявления полей и методов, поэтому его можно в основном использовать для изменения исполняемого кода методов.

Если вам нужны примеры для обработки файлов классовбез дополнительных сторонних библиотек есть ответы на Stackoverflow

Конечно, эти примерытолько одноцелевой код или наброски.Если вы расширите их до чего-то более общего или полезного, вскоре вы в конечном итоге будете в основном заново реализовывать эти библиотеки.

0 голосов
/ 07 октября 2018

Файлы классов - это просто последовательность байтов, формат которых указан в Спецификация виртуальной машины Java .BufferedReader - для текстовых файлов, поэтому вам нужно BufferedInputStream, но формат довольно сложный.

Вы можете загружать манипулируемые файлы классов, как если бы они были сгенерированы javac.Вы также можете загружать их динамически с java.net.URLClassLoader.newInstance или подобным.Агент Java позволяет изменять файлы классов по мере их загрузки, либо через Java, либо через собственный интерфейс (последний необходим, если вы хотите изменить классы, загружаемые перед классами, которые загружают классы).

...