最近,我开始研究字节伙伴,并尝试挂钩一些Java方法。我尝试从java.io.ObjectInputStream挂钩readBoolean。如果我总是返回true或false,它会很好地工作。但是,如果我只希望第一个调用返回false,其余的返回原始钩子方法中的任何内容,则无法使其工作。这是我的代码:
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_CLASS中,仅以下作品:
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.REDEFINE更改为TypeStrategy.Default.REBASE,则没有任何变化>>
我一遍又一遍地阅读了这份文件,似乎仍然毫无头绪。感谢您为我指明了正确的方向。
最近,我开始研究字节伙伴,并尝试挂钩一些Java方法。我尝试从java.io.ObjectInputStream挂钩readBoolean。如果我总是返回true或false,它会很好地工作。但是我可以...
如果只希望截获第一个电话,则需要添加某种形式的状态管理。在最简单的情况下,您可以在调用之后设置系统属性,并在执行操作之前检查它是否已设置。