使用byte-buddy

时间:2016-01-22 19:34:55

标签: java 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<?> 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 个答案:

答案 0 :(得分:1)

完全有可能:

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

默认情况下,方法实例被缓存,因此性能开销很小。