如何在使用Java代理和字节伙伴进行MethodDelegation之后调用原始方法?

问题描述 投票:0回答:1

最近,我开始研究字节伙伴,并尝试挂钩一些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,它会很好地工作。但是我可以...

java byte-buddy
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.