使用ByteBuddy为接口实现类赋值字段时抛出异常的解决方法
解决ByteBuddy实现接口时构造器调用super()的异常问题
问题原因
你推测的完全正确,异常根源就是MethodCall.invokeSuper()。因为Animal是接口,通过subclass(Animal.class)生成的类,实际父类是Object而非Animal。当你在自定义的带参构造器中调用MethodCall.invokeSuper()时,ByteBuddy默认会尝试将当前构造器的参数传递给父类构造器,但Object仅提供无参构造,这就造成了参数不匹配,触发异常。
解决方案
有两种直接的修复方式:
方式一:使用SuperMethodCall.INSTANCE自动匹配父类构造
SuperMethodCall.INSTANCE会自动识别并调用父类的对应构造器(这里就是Object的无参构造),无需手动指定参数:
.defineConstructor(Visibility.PUBLIC) .withParameter(String.class, "colour", Modifier.FINAL) .intercept( SuperMethodCall.INSTANCE .andThen( FieldAccessor.ofField("colour").setsArgumentAt(0) ) )
方式二:显式指定调用Object的无参构造
直接通过反射获取Object的无参构造方法,明确调用它:
.defineConstructor(Visibility.PUBLIC) .withParameter(String.class, "colour", Modifier.FINAL) .intercept( MethodCall.invoke(Object.class.getConstructor()) .andThen( FieldAccessor.ofField("colour").setsArgumentAt(0) ) )
验证效果
修改后重新运行代码,生成的Dog类构造器会正确执行Object的无参构造,同时完成colour字段的赋值。后续的实例化、方法调用以及字段访问都会正常工作,输出预期内容:
woof quiet woof woof loud black
内容的提问来源于stack exchange,提问作者ahrooran
相关产品推荐
相关产品推荐

