是否有一种方法可以使用bytebuddy在kotlin中动态实现API接口类? (Mixins模式)

问题描述 投票:0回答:1

让我总结一下我要实现的目标。基本上,我想要一种方法来拥有一组接口,这些接口可以作为服务器和外部插件用来与引擎交互的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?

kotlin casting java-bytecode-asm byte-buddy
1个回答
0
投票

这很有可能。例如,您可以将Byte Buddy集成为构建工具,并在发现时生成接口。只需实现Plugin界面并根据您的注释来匹配类型。

下一步,您需要使用Byte Buddy为您提供的DynamicType.Builder DSL来检测那些类型,以实现其他接口。如果您的方法始终匹配其签名,则无需做任何其他操作,因为Byte Buddy会自动检测到这些替代。如果方法签名可能不同,则需要使用MethodCall实现接口方法,以实现对实际实现的委托。

© www.soinside.com 2019 - 2024. All rights reserved.