如何在泛型类型类中获取getDeclaredMethod?(Kotlin Reflection)

问题描述 投票:0回答:1

如何通过 Kotlin Reflection 获取 Generic 类型类中的 getDeclaredMethod

我声明了泛型类型类

class ForReflectionTest<T>(val data:T=null) : SuperTester<T>{
    fun init(data2: T?){
    }
}

我想通过反射来访问它。 这个类创建了如此多的实例(超过 30 个,或最多超过 500 个) 每个实例都有不同类型的数据。

并且此实例在

list<ForReflectionTest>

中管理

但是当我尝试

getDeclaredMethod()
时,android抛出
java.lang.NoSuchMethodException: com.my.test.ForReflectionTest.init [class java.lang.String]

我该如何解决?

我尝试这样(呼叫方)

for(i:ForReflectionTest<*> in instanceList){
    val method: Method = i.javaClass.getDeclaredMethod("init", Any::class.java) // Error! NoSuchMethod
    method.invoke(i, null)
}

和其他尝试。 (数据可为空)

val method: Method = i.javaClass.getDeclaredMethod("init", if(i.data != null)i.data::class.java else Unit::class.java)) // Error! NoSuchMethod

我创造

var i = i:ForReflectionTest<String>()
我尝试这样,
i.javaClass.getDeclaredMethod(i.data::class.java)
它发生错误NoSuchMothod。但为什么? 未创建
init
方法在编译时具有
String
类型参数?

当我删除通用并尝试这样时,就成功了!

class ForReflectionTest(val data:String?=null) : SuperTester<String>{
    fun init(data2: String?){
    }
}

呼叫方

var i = i:ForReflectionTest()
i.javaClass.getDeclaredMethod("init", String::class.java)
kotlin reflection
1个回答
1
投票

您可以使用 Kotlin 反射 代替 Java 反射。

然后你可以写:

val method = i::class.declaredFunctions.first { it.name == "init" }
method.call(i, null /* or whatever data you want to use as argument */)

如果您想使用

init
元素的
data
值调用
i
函数,则只需调用
method.call(i, i.data)
即可。

© www.soinside.com 2019 - 2024. All rights reserved.