2016-01-22 81 views
1

我需要從自定義註釋中檢索參數並將它們傳遞給攔截器。例如,使用字節夥伴檢索自定義註釋的參數

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

我想使用的值id,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」中錯誤的Method類,但意識到我應該使用「java.lang.reflect.Method」。再次感謝。 – devin