Class byte-buddy interceptors/advices 之间共享

Class sharing between byte-buddy interceptors/advices

我正在尝试通过 java 应用程序中的所有外部调用传递 monitoring/tracing 信息。 为了使其透明,我正在尝试使用 byte-buddy 但在使用时遇到了一些麻烦。

为了跟踪每个传入的 (http) 请求,我拦截 HttpServlet.service(),从 HttpServletRequest 中提取令牌 header 并将其放入静态 ThreadLocal 中class 名为 TokenHolder.

为了跟踪每个传出 (http) 请求,我拦截 HttpURLConnection 并添加令牌 header 我从同一个 ThreadLocal (TokenHolder).

我遇到的问题是 TokenHolder 似乎被初始化了两次而且我的 2 个拦截器 writing-to/reading-from 不一样 ThreadLocal 我找不到办法做到这一点.

我想问题是 HttpURLConnection 存在于引导 class 路径中,而 servlet API 不存在。

额外问题:是否可以拦截 URL.openConnection()?这是我的第一个想法,但我永远做不到,因为我想 URL class 是在代理之前加载的(因为 URLClassLoader),但我不知道是否有解决方法那。

是的,您可以注册一个 RedefinitionStrategy,其中 Byte Buddy 转换之前加载的 类。为此,您需要避免添加方法或字段。这通常可以通过仅使用 Advice 来完成。

你说得对 类 需要在 bootstrap 装载机上生存。您可以将 类 放入 bootstrap 加载器,方法是将它们放入 jar 中并使用 Instrumentation 接口中的指定方法。