Как определить новый метод, перехватить и делегировать вызов этому методу? - PullRequest
0 голосов
/ 01 января 2019

Я решаю задачу для школьной работы.скажем, у меня есть класс следующим образом

class test {

public String foo(int i) {
printvalue(i);
return "foo";
}

public void printvalue(int i) {
System.out.println(i);
}
}

class Solution {
  public static void main(String[] args) {

      System.out.println(new test().foo(10));
    }
  }

вывод равен

10 foo

Теперь я создаю Java-агент, который будет перехватывать все вызовы foo иЯ хочу создать новый метод в bar следующим образом и заменить все вызовы foo просто вызовом bar (int i), а затем вернуться.

public String bar(int i) {
printvalue(i);
return "bar";
}

, поэтому выходной сигнал main должен измениться на

10 бар

Как этого добиться.Я искал, чтобы использовать bytebuddy или javassist, чтобы сделать это.Любая помощь приветствуется

1 Ответ

0 голосов
/ 05 января 2019

Это возможно в Byte Buddy с помощью MemberSubstitution.В DSL вы можете написать:

MemberSubstitution.relaxed()
  .method(ElementMatchers.named("foo"))
  .replaceWith(ElementMatchers.named("bar"))

Вы можете зарегистрировать этого посетителя, используя AgentBuilder, который реализует агент.

Вы можете реализовать пользовательский метод, используя DSL-конструктор, где выможет обеспечить реализацию в виде комбинации MethodCall и FixedValue.

...