如何使用java代理和字节伙伴在方法委派后调用原始方法?



最近我开始玩字节伙伴,并尝试钩住一些Java方法。我尝试从java.io.ObjectInputStream中钩住readBoolean。如果我总是返回真或假,它工作正常。但是,如果我只希望第一个调用返回 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;
}

如果我尝试使用 Callable,这是错误的,并且有一些运行异常@Super。

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

如果我将TypeStrategy.Default.REDEFINED更改为TypeStrategy.Default.REBASE

我一遍又一遍地阅读文件,似乎仍然没有头绪。谢谢你为我指出正确的方向。

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

建议可能是您的最佳选择。它应该可以工作,如果没有,请创建一个复制器项目。如果要使用委派,则需要注册支持引导的注入策略。

最新更新