Как использовать AgentBuilder заменить метод класса - PullRequest
0 голосов
/ 03 марта 2019

Я могу переопределить класс, чтобы заменить метод 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 голосов
/ 07 марта 2019

Вы можете просто собрать части вместе:

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();

Это, однако, будет работать, только если замененный тип совместим по форме.

...