我有一个名为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)
它会正常工作,但有没有办法动态地执行此操作?
答案 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 子>
由于KClass
与Class.forName
尚未相等,您需要使用Class.forName
,然后使用KClass
将其转换为Class.kotlin
。< / p>