Javassist. Какова основная идея и где реальное использование? - PullRequest
30 голосов
/ 04 сентября 2011

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

Хорошо, но зачем нам манипулировать байт-кодом?

Какой-нибудь реальный пример? Любое реальное приложение, где использовался Javassist?

Ответы [ 4 ]

34 голосов
/ 04 сентября 2011

Распространенным приложением является создание прокси-классов во время выполнения, то есть создание подкласса во время выполнения, который перехватывает все вызовы методов.Примеры:

Hibernate использует прокси для перехвата вызовов методов на объектах для реализации отложенной загрузки, то есть извлечения объекта из базы данных при первом обращении к нему.

Spring Framework использует Proxies для реализации своей поддержки AOP , которая, помимо прочего, обеспечивает поддержку декларативных транзакций.Он также использует прокси-серверы для обеспечения правильной видимости.

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

Реализации CDI должны также проксировать управляемые bean-компоненты для обеспечения надлежащей области видимости.Я подозреваю, что они также используют библиотеку разработки байт-кода.

I недавно использовал Javassist для реализации прозрачного кэша для возвращаемых значений метода, перехватывая все вызовы метода и делегируя только супер реализациипри первом вызове.

Обратите внимание, что java.lang.reflect.Proxy может генерировать прокси-классы во время выполнения, но может только реализовывать интерфейсы, но не расширять класс.Все вышеперечисленные варианты использования требуют проксирования классов.

15 голосов
/ 04 сентября 2011

Манипулирование байт-кодом полезно и необходимо, особенно если у вас нет исходного кода для определенных проектов. Скажем, у вас есть только байт-код (например, jar-файл) для какого-то проекта, но вы хотите как-то изменить поведение кода, библиотека манипулирования байт-кодом может помочь в таких случаях. Преимущество манипулирования байт-кодом заключается в том, что вам не нужно перекомпилировать код и вы можете напрямую выполнить его после манипуляции.

Я использовал манипулирование байт-кодом для анализа программ. Учитывая библиотеку, я хочу знать во время выполнения, какие методы в библиотеке были вызваны. Я могу использовать манипулирование байт-кодом для вставки оператора System.out.println("method_name"); в начало метода. Поэтому во время выполнения он распечатывает, какие методы были вызваны.

Некоторые библиотеки манипулирования байт-кодом:

1 голос
/ 10 марта 2017

Чтобы расширить ответ Meriton и привести реальный пример использования:

Hibernate-core (5.2.8.Final) использует javaassit (3.20.0-GA):

https://mvnrepository.com/artifact/org.hibernate/hibernate-core/5.2.8.Final

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

Страница пользователей проекта ASM содержит несколько десятков широко используемых Java-проектов и сред, использующих ASM для анализа и манипулирования байт-кодом.http://asm.ow2.org/users.html

...