使用 ByteBuddy 重新定义特定实例

时间:2021-05-04 10:30:24

标签: java bytecode byte-buddy

我对 ByteBuddy 还很陌生,这里可能缺少一些要点。

我想重新定义一个特定的实例或更精确的,在特定类中使用 ByteBuddy 实例化的 Type 实例。

因此,如果我有一个声明类型 C 的变量的类 A 和声明一个变量 C 的类 B,我只想重新定义在 A 中创建的实例并将原始实现保留在 B 中。(例如,只需重新定义通过相等检查的对象/对象 == 对象)

我尝试了以下方法,这不起作用,因为 equals 检查针对的是 TypeDescription,而不是针对 ElementMatcher.is() 方法中的对象:

Object myObject = new Object();
    new AgentBuilder.Default()
                    .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
                    .with(AgentBuilder.Listener.StreamWriting.toSystemError().withTransformationsOnly())
                    .disableClassFormatChanges()
                    .type(ElementMatchers.is(Object.class))
                    .and(ElementMatchers.is(myObject))
                    .transform((builder, typeDescription, classLoader, module) ->
                                       builder.visit(
                                               //Bind all necessary attributes here                                                
                    .installOn(instrumentation);

有什么办法可以实现吗?我没有找到任何关于 ElementMatchers 的信息。

1 个答案:

答案 0 :(得分:1)

您可以像我们在 Mockito 中所做的那样进行模拟,以在使用内联模拟生成器时识别实例是否 is a regular instance or a mock。一般情况下,仪表的实现是为了调整:

void m() {
  // some code
}

进入

void m() {
  if (MyFramework.isActive(this)) {
    // your code
  } else {
    // some code
  }
}

然而,这不适用于匹配器,而是您需要在代码中实现的东西。您不能将类重新转换为仅针对给定的一组实例进行调整。类的想法是定义作为该类的直接实例的任何对象的形状。