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

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

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

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

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

Ответы

Ответ 1

ASM

http://asm.objectweb.org/

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

EDIT (после комментария McDowell): Действительно, посетители сильно используются в ASM, но это больше, чем простые посетители: посещаемая структура данных лениво построена парсером, поэтому, если вас не интересуют определенные части файла classfile ( например, вы хотите знать имена методов, но вам не важно их тело), ​​вы можете вернуть null из метода visitMethod(). Это заставит синтаксический анализатор пропускать разделы тела метода, тем самым предотвращая (дорогое) построение сети объектов, полностью описывающих метод.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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