如何动态调用 kotlin 的 object(singleton) 方法?

0 java reflection kotlin

我有一个ApiService像这样命名的 Kotlin 单身人士:

object ApiService {
    private val someApi:SomeApi = SomeApi.create()
    fun getSomeApi():SomeApi{
        return someApi
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想ApiService.getSomeApi动态调用。我做了这样的事情:

val fullClassName = "com.somepackage.ApiService"
val obj = Class.forName(fullClassName)
obj.getMethod("getSomeApi").invoke(obj)
Run Code Online (Sandbox Code Playgroud)

但我得到了一个错误,如:

Expected receiver of type com.somepackage.ApiService, but got java.lang.Class <com.somepackage.ApiService>
Run Code Online (Sandbox Code Playgroud)

如果我硬编码.invoke(ApiService)它会正常工作,但是有没有办法动态地做到这一点?

Moi*_*ira 5

单例方法仍然是实例方法,因此您需要在调用它时将对象实例传递给方法:

val fullClassName = "com.somepackage.ApiService"
val cls = Class.forName(fullClassName)
val kotlinClass = cls.kotlin
cls.getMethod("getSomeApi").invoke(kotlinClass.objectInstance)
Run Code Online (Sandbox Code Playgroud)

这是与任何其他实例方法,但因为你不具备的情况下,因为你反射调用它,你需要来检索实例KClass使用objectInstance

对象声明的实例,或者null此类不是对象声明。
kotlin.reflect.KClass.objectInstance

由于KClass没有等价于Class.forName(yet),您需要使用Class.forName然后将其转换为KClassusing Class.kotlin