我有一个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)它会正常工作,但是有没有办法动态地做到这一点?
单例方法仍然是实例方法,因此您需要在调用它时将对象实例传递给方法:
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。
| 归档时间: |
|
| 查看次数: |
1982 次 |
| 最近记录: |