gpt4 book ai didi

java - 无法使用 ByteBuddy Agent 转换类

转载 作者:太空宇宙 更新时间:2023-11-04 09:26:48 25 4
gpt4 key购买 nike

我实际上正在使用 ByteBuddy API 编写一个 Java 代理,我需要在其中监视一些方法。举例来说,我需要记录一个方法的执行时间。

这是我的代码:

    public class PerfAgents {

public static void premain(String agentArgs, Instrumentation inst){
LOGGER.info("[Agent] Loading classes ...");
Class classToMonitor = getClassFromArgs(agentArgs);
String methodToMonitor = getMethodFromArgs(agentArgs);
installAgent(inst, classToMonitor, methodToMonitor);
}

private static void installAgent(Instrumentation instrumentation, Class<?> classToMonitor, String methodToMonitor) {
new AgentBuilder.Default()
.type(is(classToMonitor))
.transform((builder, typeDescription, classLoader, module) ->
{
LOGGER.info("Transforming {} for {}", method, classToMonitor.getSimpleName());
return builder.method(named(methodToMonitor))
.intercept(MethodDelegation.to(TimerInterceptor.class));
}).installOn(instrumentation);
}

}

TimerInterceptor 与 ByteBuddy 教程中的 LoggerInterceptor 类似,我在其中使用了 @SuperCall 注释。

问题不在于我不确定 ByteBuddy 将转换应用于提供的类和方法。我可以看到代理正在我的应用程序中加载,但是当我执行监视方法时,没有任何反应。

这是我的 TimerInterceptor 类:

static class TimerInterceptor {

private static Logger LOGGER = LoggerFactory.getLogger(LogInterceptor.class);


public static Object log(@SuperCall Callable<Object> callable) throws Exception {
LocalTime start = LocalTime.now();
Object called = callable.call();
LocalTime end = LocalTime.now();
Duration between = Duration.between(start, end);

LOGGER.info("Execution time : {} ms", between.toMillis());
return called;
}
}

如有任何帮助,我们将不胜感激。

最佳答案

您没有配置 Byte Buddy 来重新转换已加载的类。您可以通过在代理构建器 DSL 中设置 .with(RetransformationStrategy.RETRANSFORM) 来实现此目的。

如果您可以避免重新转换,即如果您仅检测执行代理时未加载的应用程序类,则可以跳过此步骤。相反,使用基于字符串的匹配器并且不加载该类。如果需要更丰富的描述,还可以使用TypePool.Default让Byte Buddy解析类文件而不加载类。

要查看 Byte Buddy 正在做什么,您可以注册一个 Listener.StreamWriting.toSystemOut(),其中所有发现的类都会打印到控制台,包括任何潜在的错误。

关于java - 无法使用 ByteBuddy Agent 转换类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57588932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com