Александр Токарев
Компания: Яндекс
При использовании сторонних библиотек иногда возникает необходимость в доработке их исходного кода. В таких случаях, как правило, делается форк исходной библиотеки, в который вносятся нужные модификации. Но что делать, если такой возможности у нас нет? Например, библиотека с закрытым исходным кодом либо есть иные ограничения на добавление модифицированной библиотеки к основному проекту.
В докладе расскажу о способе, который мы разработали для патчинга Apache Spark в рантайме через хук на classloader
c помощью JVM-функции javaagent
и библиотеки Javassist, позволяющей манипулировать байт-кодом JVM на высоком уровне. Сначала объясню, как мы пришли к этому способу, вдохновившись технологией monkey patching в Python. Затем покажу, как можно поставить хук на classloader
, используя javaagent
.
В основной части доклада обсудим, как можно изменять байт-код на высоком уровне абстракции, и рассмотрим библиотеки, позволяющие это делать. Затем покажу четыре разных способа, которые мы придумали для патчинга исходных классов библиотеки, и как мы их реализовали с использованием библиотеки Javaassist.
В заключение немного порассуждаем о том, насколько этот способ удобен и надежен и как тестировать патченные классы.
Компания: Яндекс
Компания: Positive Technologies