使用不带-javaagent参数的ByteBuddy Java代理
我正试图在一个项目中为一些类提供工具。当我将代理类打包到jar中并通过-javaagent使用它时,它工作得很好使用不带-javaagent参数的ByteBuddy Java代理,java,byte-buddy,Java,Byte Buddy,我正试图在一个项目中为一些类提供工具。当我将代理类打包到jar中并通过-javaagent使用它时,它工作得很好 public static void premain(String arguments, Instrumentation instrumentation) { new AgentBuilder.Default() .type(ElementMatchers.nameStartsWith("com.cn."))
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);
}
当我试图在项目中直接运行它时,检测有时会失败。(我在测试类的静态块中初始化bytebuddy)
例如,当我添加这个测试时,我的代码不再被截获。
对try/catch进行同样的操作
RuntimeException e = Assertions.assertThrows(RuntimeException.class, () -> f.doit("doit foo"));
有没有一种安全的方法可以在同一个项目中使用不带-javaagent的工具类
Project位于OpenJdk11上。使用-javaagent选项,您将始终确保在安装代理后加载类
如果在静态块中安装代理,则必须确保在加载任何要插入的类之前执行这段代码。您可以将代理安装在主方法中,也可以安装在主方法所在的静态块中 我检查了Foo类是否在测试类(静态块中的system.out)之后加载。后来加载了。奇怪的是,“Assertions.assertThrows”用法导致了这个问题。。。Hibernate、Mockito等库是如何解决这个问题的?我从未使用过带有-javaagent的应用程序,但它们都使用了指令插入。Mockito和Hibernate使用定义良好的生命周期,例如,Mockito在使用内联mock maker时会使用重传,其中任何被模拟的类型都会被显式重传。您是否尝试将侦听器添加到代理生成器中,以查看是否仍发现有问题的类型或是否存在错误?您是否检查了块中的安装是否引发异常?
RuntimeException e = Assertions.assertThrows(RuntimeException.class, () -> f.doit("doit foo"));