Rebase方法拦截,完全重写方法

时间:2017-07-15 13:59:27

标签: java kotlin byte-buddy

我尝试使用ByteBuddy进行一些运行时代码更改。我遇到的问题是,当我尝试重新定义方法以在末尾添加拦截调用时,整个方法被替换,并且没有声明和调用的任何$ original()方法。

这是我用于正确转换的代码

ByteBuddy()
    .rebase(clazz)
     .method(ElementMatchers.named("onEnable"))
     .intercept(MethodDelegation.to(TestInjector()))
     .make()
     .saveIn(dataFolder)

clazz和dataFolder在此之上定义,并不是问题的根源。

这是注射器方法的签名:

public void intercept(@This JavaPlugin pl)

在分析它输出的代码时,该类与预转换相同,但是已经删除了在onEnable方法中调用 的所有代码,并将其替换为单个方法委托。有没有办法,使用这样的方法,让我保留现有的方法体,但是在方法的头部添加委托调用?

1 个答案:

答案 0 :(得分:1)

如果要调用原始方法,可以使用“andThen”将SuperMethodCall链接到拦截器。这指示Byte Buddy在委托调用后调用原始方法。