好吧,我想使用bytebuddy跟踪http调用并捕获每次跟踪所花费的时间。我遇到了一个github项目并检查了一些代码,经过长时间的研究和学习,我能够这样运行它:
LoggingAgent
return new AgentBuilder.Default().disableClassFormatChanges()
.with(AgentBuilder.RedefinitionStrategy.REDEFINITION)
.with(AgentBuilder.TypeStrategy.Default.REDEFINE)
.type(ElementMatchers.hasSuperType(named("javax.servlet.Servlet")))
.transform(new AgentBuilder.Transformer() {
@Override
public DynamicType.Builder<?> transform(
DynamicType.Builder<?> builder,
TypeDescription typeDescription,
ClassLoader classLoader) {
return builder.visit(Advice.to(LoggingAdvice.class).on(
named("service"))); // Methodname = pointcut method = service()
}
});
LoggingAdvice
@Advice.OnMethodEnter
public static void intercept(@Advice.BoxedArguments Object[] allArguments,
@Advice.Origin Method method) {
Logger logger = LoggerFactory.getLogger(method.getDeclaringClass());
logger.info("Method {} of class {} called", method.getName(), method
.getDeclaringClass().getSimpleName());
for (Object argument : allArguments) {
logger.info("Method {}, parameter type {}, value={}",
method.getName(), argument.getClass().getSimpleName(),
argument.toString());
}
}
当我在运行时使用byte-buddy-loader注入该代理时,代码运行正常,没有任何问题。但是,每当我尝试通过传递CommandLine争论来运行它时,它都会停止整个应用程序。
此后,我尝试使用类加载器运行此代码,然后在使用类加载器加载代理时将其作为命令行参数传递。有效!但是现在,实际的问题是每当我尝试使用类变量/全局变量并将其注入到应用程序中时。该应用程序为LoggingAdvice.class抛出NoClassDefFoundError
有人可以引导我朝正确的方向前进吗?
编辑,这不是重复的操作,如上所述,我每次尝试访问全局变量时都无法使用它。在不访问全局变量的情况下,代码可以正常工作。