用 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.
直接实例的任何对象的形状
我是 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.
直接实例的任何对象的形状