Шаблоны манипулирования байт-кодом - PullRequest
7 голосов
/ 23 апреля 2010

Какое законное использование существует для манипулирования байт-кодом и как люди реализуют эти решения на основе манипулирования байт-кодом на практике?

Обновление: Я должен был прояснить, что этот вопрос действительно о том, какие шаблоны и методы люди используют, чтобы заставить свой код летать с помощью манипулирования байт-кодом.

Что-то вроде аспектно-ориентированного программирования, о котором уже упоминалось, или создание прокси-объектов на лету и аналогичные методы.

Ответы [ 5 ]

8 голосов
/ 23 апреля 2010

Манипулирование байт-кодом позволяет вам выполнять произвольно сложные (и интересные) преобразования программы, такие как:

  • код входа / выхода для выбранных функций
  • преобразования безопасности, которые блокируют доступ кнекоторые API-интерфейсы
  • для замены API, например, для выполнения кода в тестовом жгуте.

Область действия бесконечна;это всего лишь небольшая выборка.

Что касается того, как это обычно делается, запустите здесь .

4 голосов
/ 23 апреля 2010

Итак, можно прочитать байт-код для реализации интерпретатора / JVM.Можно написать / сгенерировать байт-код при реализации компилятора Java или компилятора для другого языка, предназначенного для JVM (например, Scala и Jython ).Вы можете выполнить манипулирование байт-кодом для оптимизации байт-кода (если вы хотите производить и продавать оптимизатор байт-кода или вам нужен его как внутренний инструмент, чтобы дать коду вашей компании преимущество над конкурентами).Аналогичным образом, вы можете манипулировать байт-кодом, чтобы скрыть его перед распространением.Вы также можете выполнить манипулирование байт-кодом для аспектно-ориентированного программирования ;например, вы можете захотеть вставить хуки (может быть, для целей синхронизации или регистрации или по какой-то другой причине), и если манипулировать байт-кодом проще или дешевле, чем редактировать все исходные файлы (например, еслиисходный код недоступен или из многих разных источников, не все из которых могут находиться под контролем или для которых может быть дорого и много времени, чтобы убедить эти команды добавить такие ловушки), это может быть случай, когдаимеет смысл вставлять изменения в окончательный вывод байт-кода, а не пытаться изменить исходный код (что может потребовать добавления или поддержки отдельного ветвления или приобретения исходного кода у третьей стороны, которая предоставляет только байт-код).

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

3 голосов
/ 23 апреля 2010

Имеются статьи Шаблоны аспектно-ориентированного проектирования (PDF) и Принципы аспектно-ориентированного проектирования: уроки объектно-ориентированного проектирования (PDF), в которых описываются некоторые шаблоны для АОП / манипулирование байт-кодом.

Лично я использовал манипулирование байт-кодом с ASM в одном фреймворке для генерации стандартного кода для классов, использующих этот фреймворк. Фреймворк требует пользовательских методов equals () и hashCode () для клиентского кода, поэтому я генерирую эти , подключая Java Agent , который изменяет байт-код, когда ClassLoader загружает классы. Я также много раз использовал CGLIB для создания динамических прокси (если это считается AOP).

2 голосов
/ 23 апреля 2010

Одно использование для манипулирования байт-кодом в аспектно-ориентированном программировании .В Java вы можете использовать AspectJ для этого.

0 голосов
/ 23 апреля 2010

Некоторые инфраструктуры, такие как BEA KODO (реализация спецификации объектов данных Java), используют манипулирование байт-кодом для «улучшения» простых старых объектов Java и добавления логики персистентности на основе описания XML.

Таким образом, информация о сопоставлении базы данных автоматически генерируется в байт-коде.

...