1

背景: 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 にまったく慣れていません。誰かが私が間違っていることのヒントを教えてくれるかもしれません。

4

1 に答える 1

0

まず第一に、ignore マッチャーを正しくチェーンしていません。そのはず:

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

hasSuperTypeインターフェースのマッチングに関しては、マッチャーを試すことができます。特定のパッケージのインターフェイスを一致させようとする場合は、次のことを試してください。

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

プレフィックスマッチャーを使用すると、正規表現に比べてはるかに効率的です。

于 2016-08-12T15:47:33.180 に答える