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