让我总结一下我要实现的目标。基本上,我想要一种方法来拥有一组接口,这些接口可以作为服务器和外部插件用来与引擎交互的api的服务器。
这是我目前的设置方式。
class Engine : ApiEngine {
override fun start() {
println("Starting Engine")
}
override fun stop() {
println("Stopping Engine.")
}
}
interface ApiEngine {
fun start()
fun stop()
}
这很麻烦,我已经看到了其他一些使用ASM并将其动态注入接口到“ Engine”类中的解决方案。我在其他来源中也看到过类似的内容,但从未完全知道该怎么做。
@Implements("ApiEngine")
class Engine {
@Export("start")
fun start() {
println("Starting Engine")
}
@Export("stop")
fun stop() {
println("Stopping Engine.")
}
}
interface ApiEngine {
@Import("start")
fun start()
@Import("stop")
fun stop()
}
我的问题是,在ByteBuddy中,是否可以有效地使Engine
实现为ApiEngine
,以便可以将Engine()的实例强制转换为ApiEngine以用于API?
这很有可能。例如,您可以将Byte Buddy集成为构建工具,并在发现时生成接口。只需实现Plugin
界面并根据您的注释来匹配类型。
下一步,您需要使用Byte Buddy为您提供的DynamicType.Builder
DSL来检测那些类型,以实现其他接口。如果您的方法始终匹配其签名,则无需做任何其他操作,因为Byte Buddy会自动检测到这些替代。如果方法签名可能不同,则需要使用MethodCall
实现接口方法,以实现对实际实现的委托。