java - 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
谁能指导我正确的方向?
编辑这不是重复的,我在上面提到过,每当我尝试访问全局变量时,它就不起作用。在不访问全局变量的情况下,代码可以正常工作。
解决方案
推荐阅读
- php - PHPMailer 不工作,而 php mail() 工作
- authentication - 具有多个 Webassembly 应用程序的托管部署的 Blazor 身份验证
- python - 使用装饰器管理函数内部的属性
- templates - PHPWord(模板):调整现有表格单元格的属性(填充/边框)
- android - 如何停止/取消活动中的任务?Android中的runOnUiThread?
- conditional-statements - 赛普拉斯 ckeck 是否存在任何字段中的文本
- pyspark - 如何在工作节点的 HDInsight pyspark 中写入 blob
- jenkins - 如何在声明式管道(Jenkinsfile)中配置动态参数?
- html - 如何根据 React 中的动态值初始化复选框
- node.js - 如何设置 Next.js + Node.js (Typescript) 服务器 AWS EC2