【问题标题】:How to define a new method and intercept and delegate a call to that method?如何定义一个新方法并拦截和委托对该方法的调用?
【发布时间】:2019-01-06 01:51:18
【问题描述】:

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

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 呵呵

现在我正在创建一个 java 代理,它将拦截对 foo 的所有调用,我想在 bar 中创建一个新方法,如下所示,并将所有对 foo 的调用替换为只调用 bar(int i) 然后返回。

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

所以 main 的输出应该变成

10 酒吧

我怎样才能做到这一点。我正在寻找使用 bytebuddy 或 javassist 来做到这一点。任何帮助表示赞赏

【问题讨论】:

  • 您可以在 java 中检查面向方面的编程。编写一个装饰器来拦截调用。

标签: javassist byte-buddy


【解决方案1】:

这可以通过使用MemberSubstitution 在Byte Buddy 中实现。在 DSL 中,你可以这样写:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2021-06-08
    相关资源
    最近更新 更多