[英]Using ByteBuddy Java agent without -javaagent argument
我正在尝试在项目中检测一些类。 当我将 package 代理类放入 jar 并通过 -javaagent 使用它时,它工作正常。
public static void premain(String arguments, Instrumentation instrumentation) {
new AgentBuilder.Default()
.type(ElementMatchers.nameStartsWith("com.cn."))
.transform((builder, type, cl, m) -> builder
.method(ElementMatchers.isAnnotatedWith(Retryable.class))
.intercept(to(Retry.class)))
.installOn(instrumentation);
}
当我尝试直接在项目中运行它时,检测有时会失败。 (我在测试类的 static 块中初始化 bytebuddy)。
static {
Instrumentation inst = ByteBuddyAgent.install();
new AgentBuilder.Default()
.type(ElementMatchers.nameStartsWith("com.cn."))
.transform((builder, type, cl, m) -> builder
.method(ElementMatchers.isAnnotatedWith(Retryable.class))
.intercept(to(Retry.class)))
.installOn(inst);
}
例如,当我添加此测试时,我的代码不再被拦截。 对 try/catch 做同样的事情。
RuntimeException e = Assertions.assertThrows(RuntimeException.class, () -> f.doit("doit foo"));
有没有一种安全的方法可以在没有-javaagent 的情况下在同一个项目中检测类?
项目在 OpenJdk11 上。
使用 -javaagent 选项,您将始终确保在安装代理后加载您的类。
如果将代理安装在 static 块中,则必须确保在加载要检测的任何类之前执行这段代码。 例如。 您可以将代理安装在您的主要方法中,或者安装在主要方法所在的 static 块中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.