如何使用 ByteBuddy 的 canThrow() 参数匹配器?

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

我正在编写一些代码,我想在类中检测抛出特定异常的每个方法,所以我想要这样的东西:

builder.method(ElementMatchers.canThrow(nameStartsWith("RestClientException")));

但是,这些类型不起作用,因为 canThrow 需要 Class 或 TypeDescription。

我不相信使用 RestClientException.class 会在这里工作,因为我想创建一个 Java 代理,所以我必须在我的客户端中包含 spring-web 只是为了在这里使用该类,而且 我相信 不会如果这与正在检测的应用程序的版本不完全相同,则可以正常工作。

这使得 TypeDescription 成为选项,但我不知道是否有办法将 ElementMatcher 变成 TypeDescription。 ByteBuddy 有一个很好的教程,但是 javadoc 非常笨拙且难以导航,所以我在这里问这个问题。

我可以使用不同的方式来匹配所有这些功能,但这似乎是一个不错的快捷方式,并且很高兴知道它通常是否可行。

java instrumentation byte-buddy javaagents
1个回答
0
投票

最简单的解决方案是实现自定义元素匹配器:

ElementMatcher.Junction<MethodDescription> matcher = new ElementMatcher.Junction.AbstractBase<MethodDescription>() {
    @Override
    public boolean matches(MethodDescription target) {
        for (TypeDescription.Generic exceptionType : target.getExceptionTypes()) {
            if (exceptionType.asErasure().getName().startsWith("org.springframework.web.client.RestClientException")) {
                return true;
            }
        }
        return false;
    }
};

ElementMatchers API 仅包含常见情况,我会考虑包括您的场景。但一般来说,自定义匹配器可能提供最简单的方法。

注意,需要匹配包名,而不仅仅是简单的名称。

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