使用 ByteBuddy 重新定义方法

Redefine methods with ByteBuddy

我正在尝试使用 ByteBuddy 重新定义一些方法。 当我使用 FixedValue.value() 拦截方法时,没问题。 但是使用拦截器拦截方法,编译器会抛出 UnsupportedOperationException。

我想覆盖“Foo.nothing()”方法来打印一些东西。

public class Foo {
    public String getHello() {
        return "not redefined hello!";
    }
    public String getBye() {
        return "not redefined Bye!";
    }
    public void nothing() {}
}

这是我的拦截器:

public class GeneralInterceptor {
    @RuntimeType
    public Object intercept(@AllArguments Object[] allArguments,
                            @Origin Method method) {
        System.out.println("asdfasdf");
        return null;
    }
}

这是我重新定义的代码

public class RedefineTest {
    ClassReloadingStrategy classReloadingStrategy;
    @BeforeEach
    public void init() {
        ByteBuddyAgent.install();
        classReloadingStrategy = ClassReloadingStrategy.fromInstalledAgent();
    }

    @Test
    public void redefineTest() {
        // okay
        new ByteBuddy()
                .redefine(Foo.class)
                .method(named("getHello"))
                .intercept(FixedValue.value("ByteBuddy Hello!"))
                .make()
                .load(Foo.class.getClassLoader(), classReloadingStrategy);
        // error
        new ByteBuddy()
                .redefine(Foo.class)
                .method(named("nothing"))
                .intercept(MethodDelegation.to(new GeneralInterceptor()))
                .make()
                .load(Foo.class.getClassLoader(), classReloadingStrategy);
        Foo foo = new Foo();
        System.out.println(foo.getHello());
        System.out.println(foo.getBye());
        foo.nothing();
    }
}

我解决了!

public class GeneralInterceptor {
    @RuntimeType
    public static Object intercept(@AllArguments Object[] allArguments) {
        System.out.println("asdfasdf");
        return null;
    }
}

并改变

intercept(MethodDelegation.to(new GeneralInterceptor())

intercept(MethodDelegation.to(GeneralInterceptor.class)