微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 ElementMatchers 调用已在 ByteBuddy 中覆盖的超类中的方法

如何解决使用 ElementMatchers 调用已在 ByteBuddy 中覆盖的超类中的方法

我想在bytebuddy中动态创建这样的类

public class Parent {

    public boolean testMethod(int n){
        return true;
    }
}

public class Child extends Parent{

    @Override
    public boolean testMethod(int n) {
        return false;
    }

    public boolean testMethodSuperWrapper(int n){
        return super.testMethod(n);
    }
}

我写的代码是这样的:

Class parentClass = new ByteBuddy().subclass(Object.class).name("Parent")

                .defineMethod("testMethod",boolean.class,Modifier.PUBLIC)
                .withParameter(int.class).intercept(FixedValue.value(true))

                .make().load(Test.class.getClassLoader()).getLoaded();

Class childClass = new ByteBuddy().subclass(parentClass).name("Child")

                .defineMethod("testMethod",Modifier.PUBLIC)
                .withParameter(int.class).intercept(FixedValue.value(false))

                .defineMethod("testMethodSuperWrapper",Modifier.PUBLIC)
                .withParameters(int.class).intercept(MethodCall.invoke(
                        ElementMatchers.isMethod()
                                .and(ElementMatchers.hasMethodName("testMethod"))
                                .and(ElementMatchers.takesArguments(int.class))
                        //.and(ElementMatchers.isDeclaredBy(parentClass))
                )
                        .onsuper()
                        .withAllArguments())
                .make().load(parentClass.getClassLoader()).getLoaded();


        Object childClassObject = childClass.newInstance();
        Method superWrapperMethod = childClass.getmethod("testMethodSuperWrapper",int.class);
        boolean res = (boolean) superWrapperMethod.invoke(childClassObject,23);
        System.out.println(res);

我知道我可以使用 Method 类来使 testMethodSuperWrapper 调用方法,但由于我的项目(循环类型)中的原因,我需要创建 testMethodSuperWrapper 调用 {{1 }} 在父类中使用 ElementMatchers。

问题是当我使用 ElementMatchers 调用父类中的方法时,就像在我的代码中一样,我收到此错误testMethod

此外,如果我注释 Cannot invoke public boolean Child.testMethod(int) as super method of class Child 行并取消注释 .onsuper(),我将收到此错误 .and(ElementMatchers.isDeclaredBy(parentClass))

解决方法

这与 Byte Buddy 的内部模型有关,在该模型中,您替换由超类型定义的方法,而不是覆盖它。在 Java 中这确实是一样的,但在 Byte Buddy 中,它(不幸的是)不是。

您可以通过匹配来覆盖一个方法,而不是将其定义为:

new ByteBuddy().subclass(parentClass).name("Child")              
  .method(ElementMatchers.named("testMethod"))
  .intercept(FixedValue.value(false))

这样,您的覆盖将起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。