2010-03-28 3 views
12

Я ищу хорошо поддерживаемую библиотеку манипуляции байт-кодом Java с интуитивно понятным API. Кажется, их довольно много. Любые предложения, по которым можно попробовать?Java Bytecode Manipulation Library Предложения

ответ

6

Лучший ответ на ваш вопрос будет определяться вашими конкретными потребностями и целями; если вы можете расширить то, что вы пытаетесь выполнить, я могу предложить более индивидуальный ответ.

Вместо этого, однако, по моему опыту, ASM предлагает, вероятно, лучшее сочетание зрелости, гибкости и простоты в использовании:

  • Это при относительно активном развитии: несмотря на то, последний выпуск с июня 2009 года, разработчики регулярно совершают сделки с их VCS.
  • Это уже широко используется в ряде известных продуктов Java, таких как AspectJ, Groovy, Cobertura и многие другие, что обещает широкую базу пользователей и, следовательно, широкое сообщество для поддержки.
  • Это довольно тщательно документировано, и есть ряд руководств, руководств пользователя и справочных документов, доступных как от OW2 Consortium, так и от сообщества в целом.

N.B. Комментарий @Yuri, оставшийся ниже, описывает ситуацию, которую я лично еще не встречал, но которая может потенциально представлять собой значительное препятствие. Соблюдайте его наблюдение/опыт при оценке различных библиотек манипуляции байт-кода.

+0

Извините за отсутствие специфики в вопросе. Я бы предпочел не выделять особенности того, что я делаю, но ваш ответ был весьма полезным. Благодарю. Я думаю, что в конечном итоге я использую ASM. – Daniel

+1

Глядя на этот ответ, я попробовал ASM, и у него (4.0) есть либо ошибка, либо действительно странное поведение. Я использую Tree API и итерацию над инструкциями метода InsnList. Теперь первая итерация дает один результат, а другая идентичная итерация, следующая за первой, дает другой результат - одна команда дублируется и помещается поверх списка. Никакой код модификации вообще, только две итерации один за другим. Переключение на Javassist. –

+0

@YuriUshakov: Это не та ситуация, которую я лично пережил. Спасибо за хедз-ап! – RTBarnard

4

Это действительно зависит от того, как вы определяете интуитивно понятный ;-) Я начал использовать ASM две недели назад для выполнения определенной задачи в моем текущем проекте, и это сработало как шарм. Мне потребовалось всего пару часов, чтобы понять это и использовать его, но я бы не стал называть API интуитивно понятным. Но если вы немного знаете о байт-коде Java и знакомы с шаблоном посетителя, кривая обучения не очень высока, IMO.

Еще одно преимущество ASM заключается в том, что оно, по-видимому, связано со стандартным API, по крайней мере, в Sun JDK, хотя в другом пакете (com.sun.xml.internal.ws.org.objectweb.asm и подпакетах).

+0

Вы правы: судя по некоторым странным API-интерфейсам, определения людей интуитивно понятны, по-видимому, широко различаются;). Я просто потратил немного времени на ASM, и я гораздо менее запуган, чем я ожидал! Думаю, я буду придерживаться этого. Спасибо за Ваш ответ. – Daniel

+0

Пожалуйста, не используйте пакеты реализации ... –

+1

Да, правильно, не используйте пакеты реализации. И не манипулируйте байт-кодом, если вам действительно не нужно ;-) –