Warm tip: This article is reproduced from serverfault.com, please click

java-当方法肯定是该类的一部分时,获取* NoSuchMethodException *

(java - Getting *NoSuchMethodException* when method definitely is part of the class)

发布于 2020-11-29 14:17:37

我有以下课程:

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来获取包含类中所有方法名称的列表,并且该方法存在。这表示我发送了错误的参数(但无法找出错误的原因)附件列表:

在此处输入图片说明

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

onRecyclerItemClickListenerRef.get()?.javaClass

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

然后将其发送为:

castedVariable.javaClass

没有帮助。也许有人可以给我一个解决方法的想法?

Questioner
Eitanos30
Viewed
0
Keyser Söze 2020-11-30 00:37:11

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

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"