微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 ByteBuddy 重新定义特定实例

如何解决使用 ByteBuddy 重新定义特定实例

我对 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 的信息。

解决方法

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

void m() {
  // some code
}

进入

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。