ByteBuddy:无法访问类变量

时间:2019-07-02 06:29:25

标签: java byte-buddy

好吧,我想使用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

有人可以引导我朝正确的方向前进吗?

编辑,这不是重复的操作,如上所述,我每次尝试访问全局变量时都无法使用它。在不访问全局变量的情况下,代码可以正常工作。

0 个答案:

没有答案