Java Bytebuddy:是否可以通过用lambda表达式替换执行来拦截方法?

Java Bytebuddy:是否可以通过用lambda表达式替换执行来拦截方法?,java,bytecode,byte-buddy,Java,Bytecode,Byte Buddy,是否可以通过使用lambda表达式替换执行来截获方法,或者通过其他类的非静态方法来截获方法? 例1: 目的是避免使用静态方法编写类来执行拦截。 例2: 公共A类{ 公共空间{ System.out.println(“你好”); } } 公共B级{ 公共空间{ System.out.println(“再见”); } } // ... @试验 void interceptAReplacingByB(){ 最终类sourceClass=A.Class; final B=Mockito.spy(新的B(

是否可以通过使用lambda表达式替换执行来截获方法,或者通过其他类的非静态方法来截获方法?

例1:

目的是避免使用静态方法编写类来执行拦截。

例2:

公共A类{
公共空间{
System.out.println(“你好”);
}
}
公共B级{
公共空间{
System.out.println(“再见”);
}
}
// ...
@试验
void interceptAReplacingByB(){
最终类sourceClass=A.Class;
final B=Mockito.spy(新的B());
拜特巴迪
.重新定义(sourceClass)
.method(名为(“sayHello”))
.intercept(/*从B调用saybaye或创建lambda表达式来执行此操作*/)
.make()
.装载(
sourceClass.getClassLoader(),
ClassReloadingStrategy.fromInstalledAgent());
新的A().sayHello();
Mockito.verify(b.saybeaye();
}
此代码段不代表完整的场景。它只是为了举例说明这个问题


截取公共方法可以通过其他方式完成,但目标不是仅使用公共方法,或仅使用测试场景。

如果我理解正确:

// ...
.intercept(net.bytebuddy.implementation.MethodCall.invoke("sayGoodbye").on(b))
// ...

注意。

我不确定你想要什么。也许,你想用。由于
InvocationHandler
是一个函数接口,您可以使用lambda表达式来实现它。我再举一个例子来解释我想研究的假设。谢谢。调用java.lang.instrument.Instrumentation时出错#retransformClasses java.lang.IllegalStateException:调用java.lang.instrument.Instrumentation时出错#retransformClasses。。。原因:java.lang.UnsupportedOperationException:类重新定义失败:尝试更改架构(添加/删除字段)祝您好运。我看到您将重新定义类与代理混合在一起,这是一个我没有经验的用例。
    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))
// ...