当方法肯定是 class 的一部分时获取 *NoSuchMethodException*

Getting *NoSuchMethodException* when method definitely is part of the class

我有以下 class:

class CountryDataItem (
    id: Long?, 
    private val countryName :String?, 
    private var countryFlagUrl : String?,
    var gameCount : Int,  
    var liveCount:Int
) : BaseDataItem(id) {
    
    companion object {
        
        fun onCreateViewHolder(
            parent: ViewGroup,
            onRecyclerItemClickListener: OnRecyclerItemClickListener?
        ): RecyclerView.ViewHolder {
            val view: View =
                LayoutInflater.from(parent.context).inflate(R.layout.country_item, parent, false);
        }
    }
}

但是当运行:

someKClass.java.getMethod(
    "onCreateViewHolder",
    parent.javaClass,
    onRecyclerItemClickListenerRef.get()?.javaClass
)

我遇到了异常。 不明白为什么 我什至使用方法:getMethods 来获取包含 class 中所有方法名称的列表,并且该方法存在。这意味着我发送了一个错误的参数(但无法弄清楚什么是错误的) 附件列表:

附加信息: 我发送给 getMethod 的第二个参数是一个 WeakReference,它在他内部隐藏了一个来自类型 AllScoresFragment 的实例实现接口OnRecyclerItemClickListener,但是当我运行 getMethod方法时:

onRecyclerItemClickListenerRef.get()?.javaClass

,结果是 AllScoresFragment 类型而不是 OnRecyclerItemClickListener 类型。因此他找不到方法并抛出异常。 在发送之前尝试转换对象: val castedVariable = onRecyclerItemClickListenerRef.get() as? OnRecyclerItemClickListener

然后发送为:

castedVariable.javaClass

没有帮助。 也许有人可以告诉我如何解决这个问题?

在 class Kotlin 中创建伴随对象等同于在 Java 中的 class 中创建静态最终 class。因此,伴随对象中定义的方法不等同于 Java 中的 class 中的静态方法,并且无法像您尝试的那样访问。试试这个:

import kotlin.reflect.full.companionObject

someKClass.companionObject?.java?.getMethod(
    "onCreateViewHolder", 
    ViewGroup::class.java,
    OnRecyclerItemClickListener::class.java
)

如果找不到导入,请添加 kotlin-reflect 库。

implementation "org.jetbrains.kotlin:kotlin-reflect:1.4.20"