基于Can I redefine private methods using Byte Buddy?的想法,我想从父类重新定义私有方法。 那可能吗?或者它就像鸡和蛋的问题?
谢谢!
答案 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
时才执行实际代码。