我可以使用Byte Buddy从父类重新定义私有方法吗?

时间:2017-02-17 16:17:24

标签: java bytecode byte-buddy

基于Can I redefine private methods using Byte Buddy?的想法,我想从父类重新定义私有方法。 那可能吗?或者它就像鸡和蛋的问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

私有方法几乎不会被调度,因此,您无法更改子类中私有方法的调度。执行此操作的唯一方法是将条件分派直接硬编码到私有方法中。

您可以将Byte Buddy的Advice类与Java代理结合使用。 Java代理如下所示:

new AgentBuilder.Default()
  .disableClassFormatChanges()
  .with(RedefinitionStrategy.REDEFINITION)
  .type(is(ClassWithPrivateMethod.class))
  .transform((builder, type, cl, module) -> {
     return builder.visitor(Advice.to(MyAdvice.class)
                                  .on(named("privateMethod")));
   }).install(inst);

其中MyAdvice的代码在名为privateMethod的方法的内容中被内联。条件派遣如下所示:

class Adv {
  @OnMethodEnter(skipOn = OnNonDefaultValue.class)
  static boolean intercept(@This ClassWithPrivateMethod self) {
    if (self instanceof ParentClass) {
      // Your code
      return true;
    } else {
      return false;
    }
  }
}

通过返回true并使用跳过条件,只有在返回false时才执行实际代码。