Какую библиотеку / программу можно использовать для генерации байт-кода Java?

Я знаю про BCEL, но этот проект кажется мертвым, так как у него не было релизов два года. И мир Java движется вперед. Например, JDK 1.6 имеет новый формат файла класса.

Итак, какую библиотеку можно использовать для создания байт-кода для JVM. Если библиотеки нет, программа тоже в порядке, если я могу детально манипулировать сгенерированным кодом, например ассемблер байт-кода.

Какое программное обеспечение вы можете порекомендовать? Это тоже легко использовать? есть хорошие примеры / учебники?

Обновлено: Для всех, кто спрашивает: Да, javac в порядке. Но для создания некоторых классов во время выполнения путь непосредственно к байт-коду был бы более чистым.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
15
0
5 956
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Я думаю, что мой любимый создатель байт-кода java называется javac, и вы можете найти его на www.sun.com

У меня такое чувство, что Мнемент спрашивает о чем-то другом, и у нас возникла проблема с лексикой.

Karl 15.11.2008 00:40

Почему бы не использовать компилятор Java, javac? Что плохого в использовании его для генерации байтового кода JVM?

[Серьезно. Что мешает вам взять исходный код, создать Java и скомпилировать его?]

В некоторых случаях вы хотите программно сгенерировать байт-код. Если это на компьютере пользователя, вы не можете предположить, что у него установлен полный JDK.

James Van Huis 15.11.2008 00:54

Возникли проблемы с представлением приложения настолько крутого, что для него требуется компилятор, но недостаточно крутого, чтобы включить его в загрузку. Хотя это технически возможно, это маловероятно.

S.Lott 15.11.2008 00:57

Распространенным приложением является компиляция языков, отличных от Java, в байт-код Java. Скриптам, расширяющим что-то вроде игры или фоторедактора, может потребоваться выполнение скомпилированного кода. Кроме того, Java 7, вероятно, будет включать байт-код, который не может быть создан действительной программой Java (invokedynamic для динамических языков).

erickson 15.11.2008 01:16

Манипулирование байт-кодом необходимо для реализации инструментария, поддержки АОП, рамок разработки по контракту на основе аннотаций и т. д.

McDowell 15.11.2008 01:17

Другое приложение: обфускация кода

James Van Huis 15.11.2008 01:18

Кроме того, вы столкнетесь с юридическими проблемами при распространении JDK.

James Van Huis 15.11.2008 01:19

Другие языки, создающие байт-код, такие как Jython, используют компилятор Jython. Обфускация файла класса - не понимаю. Юридические вопросы - Sun предоставляет лицензию на распространение JDK. АОП - используйте декораторы. Пока не вижу необходимости обходить компилятор.

S.Lott 15.11.2008 04:02
Ответ принят как подходящий

КАК М

http://asm.objectweb.org/

Он намного быстрее, чем BCEL, и поддерживает обобщения и аннотации. Один момент относительно его архитектуры: для обеспечения высокой производительности ASM построен на основе синтаксического анализатора, который генерирует события (в отличие от BCEL, где синтаксический анализатор создает структуру данных). Это несколько похоже на разницу между синтаксическими анализаторами SAX и DOM. Чтобы привыкнуть к такому мышлению, требуется некоторая практика.

РЕДАКТИРОВАТЬ (после комментария Макдауэлла): действительно посетители активно используются в ASM, но это больше, чем простые посетители: структура посещаемых данных лениво создается анализатором, поэтому, если вас не интересуют определенные части файла классов (например, вы хотите знать имена методов, но не заботитесь об их теле), вы можете вернуть значение null из метода visitMethod (). Это заставит синтаксический анализатор пропускать разделы тела метода, тем самым предотвращая (дорогостоящее) построение сети объектов, полностью описывающих метод.

Я думаю, что под «выкидывающими событиями» Itay подразумевает использование шаблона посетителя. Сейчас пробую ASM - он неплохой и с хорошей документацией. Если вам нужна поддержка аннотаций в BCEL, вам нужно собрать последние исходные коды.

McDowell 15.11.2008 01:13

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

Dave L. 17.11.2008 03:58

Javassist и cglib - две хорошие инженерные библиотеки байт-кода. Они широко используются в мире Java EE для создания прокси объектов во время выполнения. Hibernate и Spring - две ведущие платформы, использующие эти библиотеки.

Существуют такие технологии, как asm и cglib, но я рекомендую Javaassist, потому что это очень хорошая библиотека для этого, и вы можете найти примеры в структуре гобелен5.

Существует довольно полный пример использования ASM для генерации байтового кода из Java-подобного промежуточного языка в реализации CAL (Haskell-подобный язык для JVM). Если скачать исходники на http://openquark.org/Open_Quark/Download.html тогда вы можете найти код в AsmJavaByteCodeGenerator.java и классы модели Java в той же папке. Сгенерированный код - это в основном то, что делал бы javac, за вычетом отладочных аннотаций.

Реализация CAL первоначально использовала BCEL, но переключилась на ASM, потому что ASM был значительно быстрее (вероятно, на порядок), и, что не менее важно, ASM является потокобезопасным, так что возможна параллельная компиляция, которая необходима для CAL.

http://serp.sourceforge.net/ - отличная библиотека для большей абстракции при редактировании байт-кода.

Другие вопросы по теме