2016-01-22 2 views
1

Мне нужно получить параметры из пользовательской аннотации и передать их в перехватчик. Например,Извлечение параметров из пользовательских аннотаций с использованием byte-buddy

@MyAnnotation(id="Some", enumpar=SomeEnum.SOMECONSTANT) 
public String sayHello() { 
} 

Я хотел бы использовать значения идентификатора и enumpar в следующем перехватчик

@RuntimeType 
public Object intercept(@SuperCall Callable<?> zuper) throws Exception { 
    // interception stuff 
    return zuper.call(); 
} 

Так как я могу расширить базовый класс, включив в него параметры аннотаций? У меня есть следующие прямо сейчас

Class<?> enhancedClass = new ByteBuddy() 
     .with(new NamingStrategy.SuffixingRandom("Proxy")) 
     .subclass(clazz) 
     .method(isAnnotatedWith(MyAnnotation.class)) 
     .intercept(MethodDelegation.to(new ListenerMetricsInterceptor())) 
     .make() 
     .load(Thread.currentThread().getContextClassLoader(), ClassLoadingStrategy.Default.WRAPPER) 
     .getLoaded(); 

ответ

1

Это вполне возможно:

@RuntimeType 
public Object intercept(@SuperCall Callable<?> zuper, 
         @Origin Method method) throws Exception { 
    MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class); 
    // interception stuff 
    return zuper.call(); 
} 

По умолчанию метод экземпляра кэшируются, поэтому накладные расходы производительности минимальна.

+0

Большое спасибо. Раньше я делал то же самое, но использовал неправильный класс метода из «net.bytebuddy.jar.asm.commons.Method», но понял, что должен использовать «java.lang.reflect.Method». Еще раз спасибо. – devin

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