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