如何在MethodDelegation之后使用java代理和byte buddy调用原始方法?

如何在MethodDelegation之后使用java代理和byte buddy调用原始方法?,java,byte-buddy,Java,Byte Buddy,最近我开始玩byte buddy,并尝试钩住一些Java方法。我尝试从java.io.ObjectInputStream钩住readBoolean。如果我总是返回true或false,它就可以正常工作。但是,如果我只希望第一个调用返回false,而其余调用返回来自原始hooked方法的任何内容,我就无法使它工作。这是我的密码: new AgentBuilder.Default() .with(RedefinitionStrategy.RETRANSFORMATIO

最近我开始玩byte buddy,并尝试钩住一些Java方法。我尝试从java.io.ObjectInputStream钩住readBoolean。如果我总是返回true或false,它就可以正常工作。但是,如果我只希望第一个调用返回false,而其余调用返回来自原始hooked方法的任何内容,我就无法使它工作。这是我的密码:

    new AgentBuilder.Default()
            .with(RedefinitionStrategy.RETRANSFORMATION)
            .with(InitializationStrategy.NoOp.INSTANCE)
            .with(TypeStrategy.Default.REDEFINE)
            .ignore(new AgentBuilder.RawMatcher.ForElementMatchers(nameStartsWith("net.bytebuddy.").or(isSynthetic()), any(), any()))
            .with(new Listener.Filtering(
                    new StringMatcher("java.io.ObjectInputStream", StringMatcher.Mode.EQUALS_FULLY),
                    Listener.StreamWriting.toSystemOut()))
            .type(named("java.io.ObjectInputStream"))  //class
            .transform((builder, type, classLoader, module) ->
                            builder.method(ElementMatchers.nameContains("readBoolean"))
                                   .intercept(MethodDelegation.to(INTERCEPTOR_CLASS))
            )
            .installOn(inst);
在INTERCEPTOR_类中,只有以下功能可用:

public static boolean readBoolean(@Origin Method m) throws Exception{
    LOGGER.log(Level.INFO, "In "+ m.getName());
    return true;
}
如果我尝试使用@Super Callable,这是错误的,并且有一些运行异常

另外,如果我尝试使用Advice.to(INTERCEPTOR_CLASS)和@Advice.OnMethodExit,我就不能使用@Advice.Return 将返回设置为true或false。为原语设置返回值似乎不起作用

如果我将TypeStrategy.Default.refine更改为TypeStrategy.Default.REBASE,则不会有任何更改


我看了一遍又一遍的文件,似乎仍然没有任何线索。谢谢你给我指明了正确的方向

如果您只想拦截第一个调用,则需要添加某种形式的状态管理。在最简单的情况下,可以在调用后设置系统属性,并在执行之前检查是否已设置该属性


建议可能是你最好的选择。它应该工作,如果没有请创建一个复制项目。如果要使用委派,则需要注册。

我了解如何使用状态来控制第一次调用。然而,我的问题是,在我的readBoolean版本中,我无法使用或调用@Super Callable。如果我使用它,我总是会得到以下异常:“[Byte Buddy]ERROR java.io.ObjectInputStream[null,null,loaded=false]java.lang.IllegalArgumentException:None of public static java.lang.Object com.test.ObjectInputStreamHook.Intercept(java.util.concurrent.Callable)throws java.lang.Exception]允许从公共布尔值java.io.ObjectInputStream.readBoolean()删除java.io.IOException…”