如何使用ByteBuddy重基现有类以移除特定实现的接口?
问题解答
你遇到的问题是因为ByteBuddy的rebase方法会完整保留原类的所有继承关系与接口实现,调用implement(Two::class.java)仅会追加声明实现该接口,并不会移除原类已实现的One接口。
要让重基后的类不再实现One接口,需要显式替换类的接口列表,而不是仅追加接口。具体做法如下:
修正后的代码
interface One { fun one(): Unit } interface Two { fun two(): Unit } class Test: One, Two { override fun one() {} override fun two() {} } val newClass = ByteBuddy() .rebase(Test::class.java) .name("com.test.Test2") // 显式设置类仅实现Two接口,覆盖原有的接口列表 .attribute(TypeAttributeAppender.ForType.WithInterfaces(Two::class.java)) .make() .load(this.javaClass.classLoader, ClassLoadingStrategy.Default.WRAPPER) .loaded val inst = newClass.declaredConstructors.first().newInstance() val isOne = inst is One // 此时值为false
关键说明
rebase方法会完整复制原类的结构,包括已实现的所有接口,所以必须主动修改接口列表才能移除不需要的接口。TypeAttributeAppender.ForType.WithInterfaces(...)会直接替换类的接口集合,仅保留你指定的接口,而非在原有基础上追加。- 重基后的类仍会保留原类中
one()方法的实现,但由于不再实现One接口,inst is One会返回false,且无法将实例向上转型为One类型。
内容的提问来源于stack exchange,提问作者expert
相关产品推荐
相关产品推荐

