ByteBuddy静态方法拦截@Origin方法

时间:2017-02-06 20:22:02

标签: java byte-buddy

我已正确拦截此静态方法

 TypeDescription commandBase = TypePool.Default.ofClassPath()
      .describe("poo.laboratoire1.Q2.Application").resolve();
 new ByteBuddy()
      .redefine(commandBase, ClassFileLocator.ForClassLoader.ofClassPath())
      .method(named("obtenirTrame"))
      .intercept(MethodDelegation.to(Mock.class))
      .make()
      .load(ClassLoader.getSystemClassLoader(),  
            ClassReloadingStrategy.Default.INJECTION);

但是当我用这个拦截器调用原始方法时:

 public static boolean[] obtenirTrame(int i, @Origin Method origin){
     ...
    origin.invoke(null, i);
     ...
 }

我在“origin”中接收新的拦截器方法而不是原始方法,从而导致无限递归。我错过了什么或者这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

通过调用@Origin方法,您将调用当前正在执行的相同方法。 Byte Buddy通过更改类来检测方法foo

class Bar {
  void foo() { /* some code */ }
}

进入

class Bar {
  void foo() { Interceptor.call( ... ); }
  void foo$original() { /* some code */ }
}

如果您想获取原始内容,可以使用@SuperMethod注释。但是,建议您使用@SuperCall@Morph注释。