Является ли BCEL == monkeypatching для Java? - PullRequest
3 голосов
/ 04 сентября 2008

коллега указал мне на днях на BCEL , который, насколько я могу судить по его объяснению и краткому прочтению, является способом изменения во время выполнения байтового кода. Моей первой мыслью было то, что это звучало опасно, а второй мыслью было то, что это звучало круто. Затем я подумал об этом и вспомнил пост codinghorror о патчах обезьян и понял, что это в основном одно и то же. Кто-нибудь когда-либо использовал BCEL для чего-нибудь практичного? Я прав, что это в основном исправление обезьян во время выполнения, или я что-то упустил?

Ответы [ 5 ]

3 голосов
/ 04 сентября 2008

Из часто задаваемых вопросов BCEL:

В: Могу ли я создавать или изменять классы динамически с BCEL?

A: BCEL содержит полезные классы в пакет утилит, а именно ClassLoader и JavaWrapper. Посмотрите на Пример ProxyCreator.

Но monkeypatching это ... ммм ... спорно, и вы, вероятно, не следует использовать, если ваш язык не поддерживает его.

Если у вас есть хороший вариант использования, могу ли я предложить встраивать Jython?

1 голос
/ 04 сентября 2008

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

0 голосов
/ 20 января 2013

BCEL не поддерживает исправление обезьян, он просто манипулирует байт-кодом и, возможно, загружает его в пользовательский загрузчик классов. Однако вы можете реализовать monkeypatching на JVM , используя такие библиотеки, как BCEL и агент Java. Агент Java (загруженный аргументом -javaagent) может обращаться к API инструментария и изменять загруженные классы. Это не сложно реализовать через несколько мостов.

Но помните:

  • Я не уверен, что вам нужно использовать -javaagent.
  • На любом языке исправление обезьян может привести к плохо предсказуемому поведению.
  • Вы можете изменить метод. Теоретически, вы также можете добавить некоторый метод, но вам нужно скомпилировать проект с использованием измененных (исправленных) классов. Я думаю, что это причинит много боли, и оно того не стоит. Существуют альтернативные языки, которые поддерживают его (например, Groovy) или поддерживают нечто подобное (например, неявные преобразования в Scala).
  • Лучше хорошо спроектировать свой API, чем использовать патчи для обезьян. Это может быть весьма полезно для сторонних библиотек.
0 голосов
/ 04 февраля 2010

См. Этот пример реального мира: Jawk - модуль компилятора BCEL полезен для "компиляции" вашего пользовательского языка.

0 голосов
/ 04 сентября 2008

Вы можете посмотреть на это как на исправление обезьяны. Я предпочитаю не использовать его (возможно, я никогда не сталкивался с хорошим вариантом использования для него?), Но быть знакомым с ним (чтобы иметь представление о том, как Spring и Hibenrate его используют и почему).

...