Я использовал Byte Buddy в приложении OSGi для реализации простой инструментальной службы. Один пакет предоставляет аннотацию, которая используется клиентскими пакетами для пометки методов, которые должны быть инструментированы, и метод, который должен быть вызван из активаторов пакетов клиентских пакетов. Вызов вызывает поиск в записях клиентских пакетов классов с методами, отмеченными аннотацией. Каждый из этих классов читается как байт-код, дополняется Advice и предварительно загружается с помощью загрузчиков классов клиентских пакетов.
Я использовал ClassLoadingStrategy.Default.INJECTION и ByteBuddy::redefine для загрузки классов. Операция, которая должна вызываться из активаторов пакетов клиентских пакетов, должна выполняться до загрузки любого из исходных классов, что позволяет избежать необходимости в агенте.
Теперь я заметил комментарий к INJECTION, в котором говорится, что он не будет работать с Java 11 и далее. Я нашел Статья DZone, который представляет ClassLoadingStrategy.UsingLookup как новый эквивалент и показывает, как поставлять код, который должен компилироваться и запускаться на Java с 8 по 11.
UsingLookup с redefine?Lookup::defineClass не позволяет заменять уже загруженные классы?Class в вызове MethodHandles::privateLookupIn, чтобы получить Lookup, который затем можно использовать для определения и загрузки инструментальных классов для этого пакета. .Спасибо!




Я обнаружил, что размещение package-info.java в каждом из целевых пакетов и загрузка этого «класса» дает изящный крючок. Однако затем я узнал об OSGi Weaving Hooks и использовал его вместо этого.