Я знаю про BCEL, но этот проект кажется мертвым, так как у него не было релизов два года. И мир Java движется вперед. Например, JDK 1.6 имеет новый формат файла класса.
Итак, какую библиотеку можно использовать для создания байт-кода для JVM. Если библиотеки нет, программа тоже в порядке, если я могу детально манипулировать сгенерированным кодом, например ассемблер байт-кода.
Какое программное обеспечение вы можете порекомендовать? Это тоже легко использовать? есть хорошие примеры / учебники?
Обновлено: Для всех, кто спрашивает: Да, javac в порядке. Но для создания некоторых классов во время выполнения путь непосредственно к байт-коду был бы более чистым.




Я думаю, что мой любимый создатель байт-кода java называется javac, и вы можете найти его на www.sun.com
Почему бы не использовать компилятор Java, javac? Что плохого в использовании его для генерации байтового кода JVM?
[Серьезно. Что мешает вам взять исходный код, создать Java и скомпилировать его?]
В некоторых случаях вы хотите программно сгенерировать байт-код. Если это на компьютере пользователя, вы не можете предположить, что у него установлен полный JDK.
Возникли проблемы с представлением приложения настолько крутого, что для него требуется компилятор, но недостаточно крутого, чтобы включить его в загрузку. Хотя это технически возможно, это маловероятно.
Распространенным приложением является компиляция языков, отличных от Java, в байт-код Java. Скриптам, расширяющим что-то вроде игры или фоторедактора, может потребоваться выполнение скомпилированного кода. Кроме того, Java 7, вероятно, будет включать байт-код, который не может быть создан действительной программой Java (invokedynamic для динамических языков).
Манипулирование байт-кодом необходимо для реализации инструментария, поддержки АОП, рамок разработки по контракту на основе аннотаций и т. д.
Другое приложение: обфускация кода
Кроме того, вы столкнетесь с юридическими проблемами при распространении JDK.
Другие языки, создающие байт-код, такие как Jython, используют компилятор Jython. Обфускация файла класса - не понимаю. Юридические вопросы - Sun предоставляет лицензию на распространение JDK. АОП - используйте декораторы. Пока не вижу необходимости обходить компилятор.
КАК М
Он намного быстрее, чем BCEL, и поддерживает обобщения и аннотации. Один момент относительно его архитектуры: для обеспечения высокой производительности ASM построен на основе синтаксического анализатора, который генерирует события (в отличие от BCEL, где синтаксический анализатор создает структуру данных). Это несколько похоже на разницу между синтаксическими анализаторами SAX и DOM. Чтобы привыкнуть к такому мышлению, требуется некоторая практика.
РЕДАКТИРОВАТЬ (после комментария Макдауэлла): действительно посетители активно используются в ASM, но это больше, чем простые посетители: структура посещаемых данных лениво создается анализатором, поэтому, если вас не интересуют определенные части файла классов (например, вы хотите знать имена методов, но не заботитесь об их теле), вы можете вернуть значение null из метода visitMethod (). Это заставит синтаксический анализатор пропускать разделы тела метода, тем самым предотвращая (дорогостоящее) построение сети объектов, полностью описывающих метод.
Я думаю, что под «выкидывающими событиями» Itay подразумевает использование шаблона посетителя. Сейчас пробую ASM - он неплохой и с хорошей документацией. Если вам нужна поддержка аннотаций в BCEL, вам нужно собрать последние исходные коды.
Если вам не нужна высокая производительность, ASM также предоставляет интерфейс на основе дерева, подобный DOM.
Существуют такие технологии, как 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/ - отличная библиотека для большей абстракции при редактировании байт-кода.
У меня такое чувство, что Мнемент спрашивает о чем-то другом, и у нас возникла проблема с лексикой.