如何动态调用Kotlin单例(object)方法?报错咨询
解决Kotlin单例反射调用实例方法的报错问题
首先咱们得搞清楚为啥会报错:你写的Kotlin object 单例,编译成Java字节码后,其实是一个带静态INSTANCE字段的final类,而getSomeApi()是这个类的实例方法,不是静态方法。你之前直接把Class对象传给invoke(),相当于用类本身作为方法的接收者,这当然不符合要求——实例方法得用类的实例来调用嘛!
给你修正后的代码,直接就能用:
val fullClassName = "com.somepackage.ApiService" // 1. 获取ApiService的Class对象 val apiServiceClass = Class.forName(fullClassName) // 2. 拿到Kotlin object生成的单例实例(通过静态INSTANCE字段) val apiServiceInstance = apiServiceClass.getField("INSTANCE").get(null) // 3. 调用实例方法getSomeApi,此时传入正确的实例作为接收者 val someApi = apiServiceInstance.javaClass.getMethod("getSomeApi").invoke(apiServiceInstance)
补充说明:
- Kotlin的
object关键字会自动生成一个名为INSTANCE的public静态字段,用来存储单例实例,所以我们可以通过getField("INSTANCE")直接获取。 - 如果你的方法是私有方法,需要先调用
method.setAccessible(true)来突破访问限制,但这里getSomeApi()是public的,所以不用额外处理。 - 调用
getField()时传null,是因为这是静态字段,不需要实例就能获取。
内容的提问来源于stack exchange,提问作者Dipesh Manandhar
相关产品推荐
相关产品推荐

