Byte Buddy и ClassLoadingStrategy.UsingLookup - PullRequest
       87

Byte Buddy и ClassLoadingStrategy.UsingLookup

0 голосов
/ 25 октября 2018

Я использовал Byte Buddy в приложении OSGi для реализации простой службы инструментария.Один пакет предоставляет аннотацию, которая используется клиентскими пакетами для маркировки методов, которые должны быть инструментированы, и метод, который вызывается из активаторов пакетов клиентских пакетов.Вызов вызывает поиск записей клиентских пакетов для классов с методами, помеченными аннотацией.Каждый из этих классов читается в виде байтового кода, дополненного Advice и загружаемого с использованием загрузчиков классов клиентских пакетов.

Я использовал ClassLoadingStrategy.Default.INJECTION и ByteBuddy::redefine для загрузки классов.Необходимость вызова операции из активаторов комплектов клиентских комплектов заключается в том, чтобы войти до того, как будет загружен любой из исходных классов, что исключает необходимость в агенте.

Теперь я замечаю комментарий к INJECTION это говорит, что это не будет работать с Java 11 и далее.Я нашел статью DZone , которая представляет ClassLoadingStrategy.UsingLookup в качестве нового эквивалента и показывает, как отправлять код, который должен компилироваться и выполняться на Java с 8 по 11.

  1. Может UsingLookupиспользоваться с redefine?
  2. Разве Lookup::defineClass не позволяет заменять классы, которые уже были загружены?
  3. Должен ли я теперь сделать так, чтобы клиентские пакеты включали класс 'hook' вкаждый из их пакетов, которые содержат классы для инструментария?Идея заключается в том, что для каждого пакета инструктор может сначала загрузить класс подключения (используя загрузчик класса клиента), а затем передать Class при вызове MethodHandles::privateLookupIn, чтобы получить Lookup, который затем можно использовать для определения и загрузкиинструментированные классы для этого пакета.
  4. У вас есть идея получше, чем 3?

Спасибо!

1 Ответ

0 голосов
/ 22 ноября 2018

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

...