ByteBuddy 从 super class 调用一个方法,该方法已在 child 中被覆盖

ByteBuddy invoking a method from super class which has been overwritten in child

在这个例子中,我使用 ByteBuddy 动态创建一个赞B

class A{
    public void greet(String name){
        System.out.println("Hello from class A "+ name + "!");
    }
}

class B extends A{
    public void greet(String name){
        System.out.println("Hola from class B "+ name + "!");
    }

    public void superGreet(String name){
        super.greet(name);
    }
}

这是我的代码:

Class<?> dynamicType = new ByteBuddy()
                .subclass(A.class)
                .name("B")
                .defineMethod("superGreet", void.class, Modifier.PUBLIC)
                .withParameters(String.class)
                .intercept(
                        MethodCall.invoke(A.class.getMethod("greet", String.class))
                                .withAllArguments()
                )
                .defineMethod("greet", void.class, Modifier.PUBLIC)
                .withParameters(String.class)
                .intercept(MethodDelegation.to(new MyInterceptor()))
                .make()
                .load(Test.class.getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
                .getLoaded();

        Object obj = dynamicType.newInstance();
        dynamicType.getMethod("superGreet", String.class).invoke(obj, "name");

当我执行此代码时 superGreet 调用 Class B 中的方法而不是 Class A 中的方法。 如何让 ByteBuddy 调用 A 中的 greet 方法?

您必须在 invoke 之后指定 MethodCall::onSuper 调用目标。