如何动态调用kotlin的对象(单例)方法?

时间:2018-03-17 08:20:07

标签: java reflection kotlin

我有一个名为ApiService的Kotlin单身人士:

object ApiService {
    private val someApi:SomeApi = SomeApi.create()
    fun getSomeApi():SomeApi{
        return someApi
    }
}

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

val fullClassName = "com.somepackage.ApiService"
val obj = Class.forName(fullClassName)
obj.getMethod("getSomeApi").invoke(obj)

但我收到的错误如下:

Expected receiver of type com.somepackage.ApiService, but got java.lang.Class <com.somepackage.ApiService>

如果我硬编码.invoke(ApiService)它会正常工作,但有没有办法动态地执行此操作?

1 个答案:

答案 0 :(得分:4)

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

val fullClassName = "com.somepackage.ApiService"
val cls = Class.forName(fullClassName)
val kotlinClass = cls.kotlin
cls.getMethod("getSomeApi").invoke(kotlinClass.objectInstance)

这与任何其他实例方法相同,只是因为您不拥有实例,因为您反复调用它,您需要从中检索实例KClass使用objectInstance

  

对象声明的实例,如果此类不是对象声明,则为null   <子> kotlin.reflect.KClass.objectInstance

由于KClassClass.forName尚未相等,您需要使用Class.forName,然后使用KClass将其转换为Class.kotlin。< / p>