0

Javassist proxyFactory 可以在运行时使用方法拦截器创建代理。但是如何通过修改类文件给类静态添加方法拦截器呢?

例如,类 Foo 有 100 个方法,在调用 Foo 实例上的任何方法之前,需要检查 Foo 实例是否已初始化。

public class Foo {

    public void methodA() {
        ...
    }

    public void methodB() {
        ...
    }

    public void methodC() {
        ...
    }

    ....
}

如何修改类文件以添加此类方法拦截器?一种方法是在每个方法的开头添加代码。有没有更好的办法?

其他字节码工具,例如 cglib,......?

4

1 回答 1

0

ByteBuddy 有两个选项可以实现这一点:

  • 使用重新定义/重新定位功能 - 您可以在“类型重新定义”/“重新定位”标签下查看 ByteBuddy教程的详细信息。这里的限制是这种转换需要在加载目标类之前完成。
  • Java 代理 - 代理在加载类之前运行,因此允许它们修改现有类。ByteBuddy 带有不错的 AgentBuilder(教程- '创建 Java 代理')。还可以在运行时安装特殊的 ByteBuddy 代理(来自上述教程的示例)。

    class Foo {
      String m() { return "foo"; }
    }
    
    class Bar {
      String m() { return "bar"; }
    }
    
    ByteBuddyAgent.install();
    Foo foo = new Foo();
    new ByteBuddy()
      .redefine(Bar.class)
      .name(Foo.class.getName())
      .make()
      .load(Foo.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent());
    assertThat(foo.m(), is("bar"));
    
于 2017-11-04T17:41:05.407 回答