将参数传递给bytebuddy拦截器

时间:2016-07-26 09:15:07

标签: java bytecode instrumentation byte-buddy

我有一个使用Byte Buddy的拦截器,我想将一个参数传递给拦截器。我怎么能这样做?

ExpressionHandler expressionHandler = ... // a handler 
Method method = ... // the method that will be intercepted
ByteBuddy bb = new ByteBuddy();
bb.subclass(theClazz)
   .method(ElementMatchers.is(method))
   .intercept(MethodDelegation.to(MethodInterceptor.class));
   .make()
   .load(theClazz.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER);

MethodInterceptor中的拦截方法是:

@RuntimeType
public static Attribute intercept(@Origin Method method, @AllArguments Object[] args) throws Exception {       
    String name = method.getName();
    Class<? extends Attribute> type = (Class<? extends Attribute>) method.getReturnType();
    ExpressionHandler expressionHandler= // ??? 
    expressionHandler.attachStuff(name, type);
    return expressionHandler;
}

如何将expressionHandler从构建器传递给拦截器方法?

1 个答案:

答案 0 :(得分:0)

只需使用实例委派而不是类级委派:

MethodDelegation.to(new MethodInterceptor(expressionHandler))

public class MethodInterceptor {

  private final ExpressionHandler expressionHandler;

  public MethodInterceptor(ExpressionHandler expressionHandler) {
    this.expressionHandler = expressionHandler;
  }

  @RuntimeType
  public Attribute intercept(@Origin Method method, @AllArguments Object[] args) throws Exception {       
    String name = method.getName();
    Class<? extends Attribute> type = (Class<? extends Attribute>) method.getReturnType();
    this.expressionHandler.attachStuff(name, type);
    return expressionHandler;
  }
}
相关问题