我正在编写一些代码,我想在类中检测抛出特定异常的每个方法,所以我想要这样的东西:
builder.method(ElementMatchers.canThrow(nameStartsWith("RestClientException")));
但是,这些类型不起作用,因为 canThrow 需要 Class 或 TypeDescription。
我不相信使用 RestClientException.class 会在这里工作,因为我想创建一个 Java 代理,所以我必须在我的客户端中包含 spring-web 只是为了在这里使用该类,而且 我相信 不会如果这与正在检测的应用程序的版本不完全相同,则可以正常工作。
这使得 TypeDescription 成为选项,但我不知道是否有办法将 ElementMatcher 变成 TypeDescription。 ByteBuddy 有一个很好的教程,但是 javadoc 非常笨拙且难以导航,所以我在这里问这个问题。
我可以使用不同的方式来匹配所有这些功能,但这似乎是一个不错的快捷方式,并且很高兴知道它通常是否可行。
最简单的解决方案是实现自定义元素匹配器:
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 仅包含常见情况,我会考虑包括您的场景。但一般来说,自定义匹配器可能提供最简单的方法。
注意,需要匹配包名,而不仅仅是简单的名称。