如何定义一个新方法并拦截和委托对该方法的调用?

时间:2019-01-01 04:59:43

标签: javassist byte-buddy

我正在解决学校作业的问题。让我们说我有一个如下的课程

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 :(得分:0)

使用MemberSubstitution可以在字节伙伴中实现。在DSL中,您可以编写:

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

您可以使用实现代理的AgentBuilder注册此访客。

您可以使用构建器DSL实现自定义方法,在其中您可以将MethodCallFixedValue的组合提供实现。