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