Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用不带-javaagent参数的ByteBuddy Java代理_Java_Byte Buddy - Fatal编程技术网

使用不带-javaagent参数的ByteBuddy Java代理

使用不带-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."))

我正试图在一个项目中为一些类提供工具。当我将代理类打包到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);
    }
当我试图在项目中直接运行它时,检测有时会失败。(我在测试类的静态块中初始化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"));