Byte Buddy 的方法委托导致 StackOverflowError

我正在尝试创建一个代理方法的代理,以便在方法之前和之后执行一些逻辑。为了做到这一点,我使用带有方法委托的 Byte Buddy。


代理人:


//Agent code before...

private static void instrument(String agentOps, Instrumentation inst) {

    new AgentBuilder.Default().with(new Eager())

            .ignore(ElementMatchers.nameContains("com.dvelopp.agenttest"))

            .or(ElementMatchers.hasAnnotation(ElementMatchers.annotationType(ElementMatchers.nameContains("SpringBootApplication"))))

            .type((ElementMatchers.any()))

            .transform((builder, typeDescription, classLoader, module) -> builder.method(ElementMatchers.any())

                    .intercept(MethodDelegation.to(Interceptor.class)))

            .installOn(inst);

}

//Agent code after...

拦截器:


public static class Interceptor {


    @RuntimeType

    public static Object intercept(@SuperCall Callable<?> superCall, @SuperMethod Method superMethod, @Origin Method currentMethod,

                                   @AllArguments Object[] args, @This(optional = true) Object me) throws Exception {

        //... logic

        Object call = superCall.call();

        //... logic

        return call;

    }

}

它在一个简单的控制台应用程序上运行完美。但是,当我的类路径中有一些公共库(例如简单的 Spring Boot 项目)时,它就无法按预期工作。


守着星空守着你
浏览 139回答 1
1回答

素胚勾勒不出你

您似乎使用了错误的注释或功能。我建议检查更简单的情况。例如替换您的实现:&nbsp; &nbsp; @RuntimeType&nbsp; &nbsp; public static Object intercept(@SuperCall Callable<?> superCall, @SuperMethod Method superMethod, @Origin Method currentMethod,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@AllArguments Object[] args, @This(optional = true) Object me) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; return superCall.call();&nbsp; &nbsp; }下一个:&nbsp; &nbsp; @RuntimeType&nbsp; &nbsp; public static Object intercept(@RuntimeType Object value) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; return value;&nbsp; &nbsp; }在这种情况下,您可以避免递归调用,但可能会有机会检测和分析不同的问题,这很清楚并且与您的情况有关。可能你也应该注意概念问题。您知道java使用Callable对象的开发人员不应该call()直接使用。以下 API 描述用于@RuntimeType从一个对象映射到另一个对象。出现了新问题:为什么需要转换callable对象?它将转换为哪种类型(您确定没有 Future 包装器,您将在那里有一个对象。null可能会导致您的异常,不是吗?)?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java