如何使用AgentBuilder替换类的方法

时间:2019-03-03 11:27:12

标签: java byte-buddy

我可以重新定义该类以将Foo的方法替换为Bar的方法:

   ByteBuddy byteBuddy = new ByteBuddy();
        byteBuddy
                .redefine(Bar.class)
                .name(Foo.class.getName())
                .make()
                .load(Foo.class.getClassLoader(),
                        ClassReloadingStrategy.fromInstalledAgent());

Foo foo = new Foo()
foo.m()
// output is bar

我如何使用AgentBuilder做同样的工作,替换所有Foo的方法,而不是委托

  new AgentBuilder.Default()
                .with(AgentBuilder.Listener.StreamWriting.toSystemOut())
                .with(RedefinitionStrategy.RETRANSFORMATION)
                .type(ElementMatchers.is(Foo.class))
                .transform(
                        ( builder, typeDescription, classLoader, module ) -> 
                              builder.method(ElementMatchers.any()).intercept( //how to write ?)

).installOnByteBuddyAgent();

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以将各个片段放在一起:

new AgentBuilder.Default()
  .with(AgentBuilder.Listener.StreamWriting.toSystemOut())
  .with(RedefinitionStrategy.RETRANSFORMATION)
  .type(ElementMatchers.is(Foo.class))
  .transform((builder, typeDescription, classLoader, module) -> 
    new ByteBuddy().redefine(Bar.class).name(Foo.class.getName()))
  .installOnByteBuddyAgent();

这仅在替换的类型与形状兼容时有效。