Агент Bytebuddy Java: AgentBuilder влияет на поток управления вторым, не связанным с ним AgentBuilder

Итак, я реализую агент Java, который устанавливает несколько AgentBuilder, один из них, только если переменная среды была определена правильно. Проблема, с которой я сталкиваюсь, заключается в том, что поведение второго AgentBuilder меняется в зависимости от того, был ли установлен дополнительный. Мне кажется, что установка необязательного AgentBuilder влияет на то, какие методы, которые используются вторым несвязанным AgentBuilder, вызываются и как часто.

if (EnvVar.isTrue()) {
            // These methods are customs so I don't have to rewrite the whole AgentBuilder-chain...
            getAgentBuilder1(inst, tempFolder).installOn(inst);
        }

getAgentBuilder2(inst, tempFolder).installOn(inst);

AgentBuilder1 использует следующее сопоставление типов:

ElementMatchers.isSubTypeOf(InputStream.class)
   .and(
        ElementMatchers.not(
            ElementMatchers.namedOneOf(InflaterInputStream.class.getName())
            .or(ElementMatchers.isPrivate())
                           )
       )

и AgentBuilder2 вот этот:

ElementMatchers.namedOneOf(Class.class.getName(), ClassLoader.class.getName());

Теперь преобразователь для AgentBuilder1 использует Advice для печати сообщения журнала при вызове read(...)-метода InputStream, а AgentBuilder2 печатает сообщение журнала при вызове ClassLoader.getResource(...)-метода или Class.getResource(...)-метода.

Все работает, как и ожидалось, за исключением того факта, что AgentBuilder2 регистрирует гораздо больше ресурсов, если AgentBuilder1 был установлен, чем если бы он не был установлен — при инструментировании одной и той же программы... Похоже, что метод Class.getResource(...) вызывается гораздо чаще если был установлен AgentBuilder1. Любые идеи?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Byte Buddy вызывает эти методы. Если вы хотите инструментировать классы, которые уже могут быть загружены, вам нужно будет использовать стратегию повторного преобразования. Кроме того, я бы рекомендовал объединить эти агенты в одном сборщике и установить его только один раз.

Спасибо! Объяснения того, почему это происходит, может быть достаточно для моих целей. Кроме того, отличная работа с библиотекой :)

Jo Bo 03.10.2022 13:22

Другие вопросы по теме