Я знаю, что Javassist - это Java-библиотека, предоставляющая средства для управления байт-кодом приложения Java.
Хорошо, но зачем нам манипулировать байт-кодом?
Любой реальный пример? Любое реальное приложение, где использовал javassist?
Я знаю, что Javassist - это Java-библиотека, предоставляющая средства для управления байт-кодом приложения Java.
Хорошо, но зачем нам манипулировать байт-кодом?
Любой реальный пример? Любое реальное приложение, где использовал javassist?
Общим приложением является создание прокси-классов во время выполнения, т.е. создание подкласса во время выполнения, который перехватывает все вызовы методов. Примеры:
Hibernate использует Proxies для перехвата вызовов метода для сущностей для реализации ленивой загрузки, то есть для извлечения объекта из базы данных при первом доступе.
Spring Framework использует Proxies для реализации своей поддержки AOP, которая, помимо прочего, обеспечивает поддержку декларативные транзакции. Он также использует прокси для обеспечения надлежащего охвата.
EJB использует прокси для реализации транзакций, управляемых контейнерами, проверки авторизации и применения пользовательских перехватчиков.
РеализацииCDI также должны проксировать управляемый beans, чтобы обеспечить правильную область видимости. Я подозреваю, что они также используют библиотеку кодирования байтового кода.
Я недавно использовал Javassist для реализации прозрачного кеша для возвращаемых значений метода, перехватывая все вызовы методов и делегируя только супер-реализацию при первом вызове.
Обратите внимание, что java.lang.reflect.Proxy
может генерировать прокси-классы во время выполнения, но может реализовывать только интерфейсы, а не расширять класс. Все вышеуказанные варианты использования требуют проксирования классов.
Использование байт-кода полезно и необходимо, особенно если у вас нет исходного кода для определенных проектов. Скажем, у вас есть только байт-код (например, файл jar) для какого-либо проекта, но вы хотите каким-то образом изменить поведение кода, в таких случаях может помочь библиотека манипулирования байт-кодами. Преимущество манипулирования байт-кодами заключается в том, что вам не нужно перекомпилировать свой код и выполнить его непосредственно после манипуляции.
Я использовал манипуляцию bytecode, чтобы выполнить некоторый программный анализ. Учитывая библиотеку, я хочу знать во время выполнения, какие методы в библиотеке были вызваны. Я могу использовать манипуляцию с байт-кодом, чтобы вставить оператор System.out.println("method_name");
в начале метода. Поэтому во время выполнения он будет распечатывать, какие методы были вызваны.
Некоторые библиотеки манипуляции с байт-кодом:
Страница пользователей проекта ASM содержит несколько десятков широко используемых Java-проектов и фреймворков с использованием ASM для анализа и манипулирования байт-кодами. http://asm.ow2.org/users.html
Чтобы расширить Meriton ответ и предоставить реальный пример использования:
Hibernate-core (5.2.8.Final) использует javaassit (3.20.0-GA):
https://mvnrepository.com/artifact/org.hibernate/hibernate-core/5.2.8.Final