Итак, я реализую агент 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. Любые идеи?




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