使用 byte-buddy 从自定义注释中检索参数
Retrieving parameters from custom annotations using byte-buddy
我需要从自定义注释中检索参数并将它们传递到拦截器中。例如,
@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 以包含注释参数?我现在有以下
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();
完全有可能:
@RuntimeType
public Object intercept(@SuperCall Callable<?> zuper,
@Origin Method method) throws Exception {
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
// interception stuff
return zuper.call();
}
默认情况下,方法实例被缓存,因此性能开销最小。
我需要从自定义注释中检索参数并将它们传递到拦截器中。例如,
@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 以包含注释参数?我现在有以下
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();
完全有可能:
@RuntimeType
public Object intercept(@SuperCall Callable<?> zuper,
@Origin Method method) throws Exception {
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
// interception stuff
return zuper.call();
}
默认情况下,方法实例被缓存,因此性能开销最小。