使用ByteBuddy检测一组接口的所有实现

时间:2016-08-12 12:09:06

标签: java instrumentation javaagents byte-buddy

背景:我想使用LogInterceptor检测一组接口(在同一个包中)的所有实现(只记录该方法被调用)。因此我写了一个带有byte-buddy的javaagent。总的来说,它工作正常,但我正在努力寻找一组接口的所有实现。

假设我们在一个包my.company.api中有一组Java接口,然后我按照以下方式尝试:

public static void premain(String arguments, Instrumentation instrumentation) {
    new AgentBuilder.Default()
        .ignore(ElementMatchers.isInterface())
        .ignore(ElementMatchers.isEnum())
        .type(ElementMatchers.nameMatches("my\\.company\\.api\\..*"))
        .transform(new AgentBuilder.Transformer() {
            @Override
            public DynamicType.Builder transform(DynamicType.Builder builder, TypeDescription typeDescription, ClassLoader classloader) {
                return builder
                        .method(ElementMatchers.isPublic())
                        .intercept(MethodDelegation.to(LogInterceptor.class));
        }
    }).installOn(instrumentation);
}

我对byte-buddy很新,也许有人可以给我一个提示我做错了什么。

1 个答案:

答案 0 :(得分:0)

首先,你没有正确地链接忽略匹配器;它应该是:

.ignore(isInterface().or(isEnum()))

对于匹配接口,您可以尝试hasSuperType匹配器。如果您尝试匹配给定包的接口,可以尝试:

hasSuperType(nameStartsWith("my.company.api.").and(isInterface()))

与正则表达式相比,使用前缀匹配器效率更高。