2010-04-23 2 views
7

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

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

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

ответ

8

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

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

Сфера применения бесконечна; это всего лишь небольшая выборка.

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

+0

Возможно, я должен был быть более ясным. Я уже знаю эти библиотеки, и я знаю, как работает Java на уровне байт-кода. То, что я действительно хочу знать, это то, что классные приемы люди придумали, чтобы делать то, что вы не могли бы сделать иначе, поэтому я имею эти решения в виду, когда я спотыкаюсь о таких проблемах. – ahe

4

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

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

+0

«было бы дешевле манипулировать байт-кодом, чем было бы редактировать все исходные файлы» - Как так? – kgdinesh

+1

@DineshBabu перефразировал, предоставил некоторые примеры, чтобы уточнить –

+0

Спасибо, но как работает манипуляция с байтовым кодом как шаблон дизайна? Если мы выйдем из области Java и поговорим на языках программирования в целом, не у всех есть эта функция. Как они это делают? – kgdinesh

3

Имеются документы Patterns of Aspect-Oriented Design (PDF) и Aspect-Oriented Design Principles: Lessons from Object-Oriented Design (PDF), которые описывают некоторые шаблоны для обработки AOP/байт-кода.

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

0

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

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

Смежные вопросы