2016-08-12 2 views
1

Фон: Я хочу, чтобы инструмент всех реализаций набора интерфейсов (в пределах одного пакета) с LogInterceptor (только ведение журнала, что метод был вызван). Поэтому я написал javaagent с байт-приятелем. В общем, это нормально работает, но я борюсь с поиском всех реализаций набора интерфейсов.Инструмент всех реализаций набора интерфейсов с ByteBuddy

Предположим, что мы имеем набор Java-интерфейсов в пакете my.company.api, то я пробовал следующим образом:

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); 
} 

Я совершенно новый с байт-приятель, может быть кто-то может дать мне намек, что я делаю неправильно.

ответ

0

Прежде всего, вы не цепляете правителей игнорирования правильно; он должен быть:

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

Что касается согласования интерфейсов, вы можете попробовать hasSuperType Искателя. Если вы пытаетесь соответствовать интерфейсы данного пакета, вы можете попробовать:

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

Использование префикса Искателя является гораздо более эффективным по сравнению с регулярным выражением.

Смежные вопросы