用 ByteBuddy 重新定义一个特定的实例

Redefine a specific instance with ByteBuddy

我是 ByteBuddy 的新手,这里可能缺少一些积分。

我想重新定义一个特定的实例,或者更准确地说,使用 ByteBuddy 在特定 class 中实例化的 Type 的实例。

所以如果我有一个 class A 声明了一个类型 C 的变量和一个 class B 也声明了一个变量 C,我只想重新定义在 A 中创建的实例并离开B 中的原始实现。(例如,重新定义通过等式检查的对象/对象 == 对象)

我尝试了以下方法,但它不起作用,因为等式检查针对的是 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 的任何信息。

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

void m() {
  // some code
}

进入

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

但这不适用于匹配器,但您需要在代码中实现。您不能将 class 重新转换为仅针对给定的一组实例进行调整。 class 的想法是定义作为 class.

直接实例的任何对象的形状