如何解决Bytebuddy:是否可以通过将执行替换为 lambda 表达式来拦截方法?
是否可以通过将执行替换为 lambda 表达式或其他类的非静态方法来拦截方法?
例 1:
installByteBuddyAgent();
byteBuddy
.redefine(sourceClass) //This is important,i need to change a class deFinition
.method(named(methodName))
.intercept({{expression}})
.make()
.load(
sourceClass.getClassLoader(),ClassReloadingStrategy.fromInstalledAgent());
//expression = Lambda expression that would be executed in place of the original method,or call a (non-static) method from some other class.
例 2:
public class A {
public void sayHello() {
System.out.println("Hello");
}
}
public class B {
public void sayGoodbye() {
System.out.println("Goodbye");
}
}
// ...
@Test
void interceptAReplacingByB() {
final Class<A> sourceClass = A.class;
final B b = Mockito.spy(new B());
byteBuddy
.redefine(sourceClass)
.method(named("sayHello"))
.intercept( /*call sayGoodbye from B or create a lambda expression to do it*/ )
.make()
.load(
sourceClass.getClassLoader(),ClassReloadingStrategy.fromInstalledAgent());
new A().sayHello();
Mockito.verify(b).sayGoodbye();
}
此代码片段并不代表完整的场景。它只是为了举例说明问题而构建的。
可以通过其他方式拦截公共方法,但目的不是只适用于公共方法,也不是只适用于测试场景。
解决方法
如果我对你的理解正确:
// ...
.intercept(net.bytebuddy.implementation.MethodCall.invoke("sayGoodbye").on(b))
// ...
注意 a static
field will be defined in your reimplementation of A
to hold the instance of b
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。