首页 > 解决方案 > ByteBuddy:无法访问类变量

问题描述

好吧,我想使用 bytebuddy 跟踪 http 调用并捕获每个跟踪所用的时间。我遇到了一个 github 项目并检查了一些代码,经过漫长而疲惫的研究和学习,我能够像这样运行它:

记录代理

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()
                }
            });

记录建议

@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 注入此代理时,代码可以正常工作。但是,每当我试图通过作为命令行参数传递来运行它时,它都会停止整个应用程序。

之后,我尝试使用类加载器运行此代码,然后将其作为命令行参数传递,同时使用类加载器加载代理。有效!但现在,实际问题是,每当我尝试使用类变量/全局变量并将其注入应用程序时。该应用程序为 LoggingAdvice.class 引发 NoClassDefFoundError

谁能指导我正确的方向?

编辑这不是重复的,我在上面提到过,每当我尝试访问全局变量时,它就不起作用。在不访问全局变量的情况下,代码可以正常工作。

标签: javabyte-buddy

解决方案


推荐阅读