【问题标题】:bytecode tools: add method interceptor to classes (not proxy)字节码工具:向类添加方法拦截器(不是代理)
【发布时间】:2018-04-16 08:14:37
【问题描述】:

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

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

public class Foo {

    public void methodA() {
        ...
    }

    public void methodB() {
        ...
    }

    public void methodC() {
        ...
    }

    ....
}

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

其他字节码工具如cglib, ....怎么样?

【问题讨论】:

    标签: javassist cglib byte-buddy method-interception


    【解决方案1】:

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

    • 使用重定义/变基功能 - 您可以在 'type redefinition'/'type rebase' 标签下查看 ByteBuddy tutorial 的详细信息。这里的限制是,这种转换需要在目标类加载之前完成。
    • Java 代理 - 代理在加载类之前运行,因此允许它们修改现有类。 ByteBuddy 带有不错的 AgentBuilder(tutorial - '创建 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"));
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多