Какую библиотеку/программу можно использовать для генерации 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 и скомпилировать его?]