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
调用目标。
在这个例子中,我使用 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
调用目标。