如何获取泛型 class 中的 getDeclaredMethod?(Kotlin 反射)
How to get getDeclaredMethod in Generic type class?(Kotlin Reflection)
如何通过 Kotlin Reflection class 获取通用类型中的 getDeclaredMethod
我声明了泛型类型class
class ForReflectionTest<T>(val data:T=null) : SuperTester<T>{
fun init(data2: T?){
}
}
我想通过反射访问它。
这个 class 创建了很多实例(超过 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 而不是 Java 反射。
那么你可以这样写:
val method = i::class.declaredFunctions.first { it.name == "init" }
method.call(i, null /* or whatever data you want to use as argument */)
如果您想使用 i
元素的 data
值调用 init
函数,只需调用 method.call(i, i.data)
.
如何通过 Kotlin Reflection class 获取通用类型中的 getDeclaredMethod
我声明了泛型类型class
class ForReflectionTest<T>(val data:T=null) : SuperTester<T>{
fun init(data2: T?){
}
}
我想通过反射访问它。 这个 class 创建了很多实例(超过 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 而不是 Java 反射。
那么你可以这样写:
val method = i::class.declaredFunctions.first { it.name == "init" }
method.call(i, null /* or whatever data you want to use as argument */)
如果您想使用 i
元素的 data
值调用 init
函数,只需调用 method.call(i, i.data)
.