Java 当方法确实是类的一部分时,获取*NoSuchMethodException*

Java 当方法确实是类的一部分时,获取*NoSuchMethodException*,java,android,kotlin,reflection,invoke,Java,Android,Kotlin,Reflection,Invoke,我有以下课程: 类CountryDataItem( 长?, private val countryName:字符串?, 私有变量countryFlagUrl:字符串?, var gameCount:Int, var-liveCount:Int ):BaseDataItem(id){ 伴星{ 趣味onCreateViewHolder( 父对象:视图组, onRecyclerItemClickListener:onRecyclerItemClickListener? ):RecyclerView.V

我有以下课程:

类CountryDataItem(
长?,
private val countryName:字符串?,
私有变量countryFlagUrl:字符串?,
var gameCount:Int,
var-liveCount:Int
):BaseDataItem(id){
伴星{
趣味onCreateViewHolder(
父对象:视图组,
onRecyclerItemClickListener:onRecyclerItemClickListener?
):RecyclerView.ViewHolder{
val视图:视图=
LayoutFlater.from(parent.context)。充气(R.layout.country\u项,parent,false);
}
}
}
但在跑步时:

someKClass.java.getMethod(
“onCreateViewHolder”,
parent.javaClass,
onRecyclerItemClickListenerRef.get()?.javaClass
)
我得到了一个例外。 不明白为什么 我甚至使用了方法:getMethods来获得一个包含类中所有方法名称的列表,并且该方法存在。这意味着我发送了一个错误的参数(但无法找出什么是错误的) 附件清单:

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

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

然后将其发送为:

castedVariable.javaClass
没用。
也许有人能告诉我如何克服这个问题?

在类Kotlin中创建一个伴生对象相当于在Java中的类中创建一个静态的final类。因此,在伴生对象中定义的方法并不等同于Java类中的静态方法,并且不能像您尝试的那样进行访问。试试这个:

导入kotlin.reflect.full.companyObject
someKClass.companionObject?.java?.getMethod(
“onCreateViewHolder”,
ViewGroup::class.java,
OnRecyclerItemClickListener::class.java
)
如果找不到导入,请添加kotlin反射库

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

stacktrace中还有其他内容吗?似乎堆栈跟踪很长,因为有很多方法,但根本原因似乎是:2020-11-29 16:57:22.891 21061-21061/com.example.todeleteimmeditaley E/123456:java.lang.NoSuchMethodException:com.example.allscorescreen.dataItems.CountryDataItem.onCreateViewHolder[class androidx.recyclerview.widget.recyclerview,class com.example.allScoresScreen.AllScoresFragment]您是第二个告诉我将.conpanionObject放在KClass实例之后的人,但它对KClass不可用(未解析)没有合适的导入…你是否锁定了我所附的图片…我不明白为什么,但这两种方法:onCreateViewHolder和onBindViewHolder路径看起来完全不同。可能是因为我有一个KClass?当调试器无法使我调试getMethodI treid以使我的生活更轻松时(真的很讨厌Kotlin)现在我当然在列表中得到了这个方法,但是当我试图通过:someKClass.java.getMethod(“onCreateViewHolder”,parent.javaClass,onRecyclerItemClickListenerRef.get()?.javaClass)获得这个方法时我仍然会遇到同样的异常。也许现在参数是错误的,但我怎么能确定呢?一切看起来都正常,但它仍然不工作。什么过程可以帮助我呢?我想使用调试器进入getMethod,但我总是做得太多!!!但我意识到导致异常的另一个原因。也许现在可以很容易地帮助我。我真的希望你仍然有足够的力量来查看我编辑的帖子