Tag: reflection

Kotlin检查函数是否需要实例参数

如果一个KCallable是使用Any()::toString创建的,那么当它被引用时,你不需要传递Any实例(当使用call )。 虽然如果它是使用Any::toString (不是Any一个实例)创建的,它需要传递一个Any实例。 所以我的问题是如何轻松地找出是否需要传递该实例参数,并且此参数是必需的? 我find了一个方法来做到这一点: callable.parameters[0].kind == KParameter.Kind.INSTANCE 但它不是很好,我想知道是否有一个更容易或推荐的方法来解决这个问题。 谢谢!

Kotlinreflection – 检查属性是否有types

我想遍历我的一个类中的所有字段,过滤注释的字段,然后检查字段是否有一个特定的types。 所有我发现是field.returnType.isSubtype(other: KType)但我不知道如何得到我的其他类的KType 。 这是我的代码到目前为止: target.declaredMemberProperties.forEach { if (it.findAnnotation() != null) { if ( /* it.returnType is Component <- Here I need some working check */ ) { // do stuff } else { // do ther stuff } } }

如何使用kotlin创建在构造函数中传递方法引用的generics类的实例

现在,我正在使用kotlin作为我的主要编程语言,我正试图简化Android的Recyclerview实现逻辑,我被困在以下几点: 比方说,我已经定义了下面的ViewHolder类,通过构造函数中的方法引用传播点击位置事件。 class CustomViewHolder(itemView: View, val onClick: (Int) -> Unit)) : RecyclerView.ViewHolder(itemView){ itemView.setOnClickListener { onClick.invoke(adapterPosition) } } 我怎样才能构建一个在构造函数中有方法引用的generics类的实例? 我的recyclerview实现在构造函数中有一个generics类,也是一个实体引用,可以通过在onCreateViewHolder上的reflection来创建我的CustomViewHolder类的实例: class CustomAdapter(val entityClass: Class) : RecyclerView.Adapter() { /* Usual recyclerview stuff */ //Method that I want to be called when a list item is clicked fun onListItemClicked(position: Int) { //do stuff } override fun onCreateViewHolder(parent: ViewGroup, […]

如何使用KClassreflection来区分Kotlin中的类和接口

我正在使用Kotlins KClass按照以下名称查找类: val i: KClass = Class.forName(“SampleClass”).kotlin 但是,我想省略接口。 到目前为止,我通过构造函数区分类和接口。 val i: KClass = Class.forName(input).kotlin if (i.constructors.isEmpty()){ println(“This is an interface”) }else{ println(“This is a class”) } 我不认为它很干净。 我正在寻找的东西沿线 i.isInterface 有这样的事情吗?

对Kotlin中的默认参数使用callBy时出错

我尝试调用带有默认参数值的函数,而不将参数放在Kotlin中。 例如: class Test { fun callMeWithoutParams(value : Double = 0.5) = value * 0.5 fun callIt(name: String) = this.javaClass.kotlin .members.first { it.name == name } .callBy(emptyMap()) } fun main(args: Array) { println(Test().callIt(“callMeWithoutParams”)) } 我有个例外: Exception in thread “main” java.lang.IllegalArgumentException: No argument provided for a required parameter: instance of fun Test.callMeWithoutParams(kotlin.Double): kotlin.Double at kotlin.reflect.jvm.internal.KCallableImpl.callDefaultMethod(KCallableImpl.kt:139) at […]

Kotlin / Android – 带有lambda的数据类中的KotlinReflectionInternalError

kotlin.reflect.jvm.internal.KotlinReflectionInternalError:反思本地函数,lambdas,匿名函数和局部variables在Kotlinreflection中还没有完全支持 这个exception来自数据类的toString() 。 数据类包含一个lambda。 我不能在我的环境中重现它。 我是否需要重写toString()来排除lambda? 或者lambda在数据类中是不允许的? data class PersistJob( private val id: Int, private val delay: Long = 10_000L, private val maxDelay: Long = 60_000L, private val iteration: Int = 0, private val block: suspend (Int) -> Boolean) { fun getDelay() = minOf(delay, maxDelay) fun withDelayIncreased() = copy( delay = minOf(delay * 2, maxDelay), […]

如何通过reflection来使用Kotlin对象

比方说,我需要通过reflection来设置由字符串给定的Kotlin对象O中的字符串给定的属性A. 如果O是一个class级,我可以做这样的事情(无视它是没有意义的): fun setValue(ownerClassName: String, fieldName: String, value : Any) { val enclosingClass = Class.forName(ownerClassName).newInstance() val enclosingClassField = enclosingClass.javaClass.getDeclaredField(fieldName) enclosingClassField.isAccessible = true enclosingClassField.set(enclosingClass, value) } 但是如果O是一个对象,我该怎么做呢?

如何用Kotlinreflection改变成员字段?

我正在从Java移植到Kotlin。 这个类声明了数百个对象。 每个对象都有一个名称属性,它与对象声明的variables名称相同。 Javareflection允许通过reflection使用声明的名称来设置对象成员name 。 只需要在数百个构造函数中保存一个参数。 我试图在Kotlin做同样的事情,但不知道如何做属性设置。 这里是一些简化的测试代码: package myPackage import kotlin.reflect.full.companionObject import kotlin.reflect.full.declaredMemberProperties class MyTestObject() { var name: String = “NotInitialized” companion object { val Anton = MyTestObject() val Berta = MyTestObject() val Caesar = MyTestObject() } } fun main(args : Array) { println(MyTestObject.Anton.name) // name not yet initialized // Initialize ‘name’ with the […]

如何将Class 与没有kotlin编译器警告的Java盒装原语types进行比较

我正在使用Kotlin编写一些与Java的reflectionAPI一起工作的东西。 我的输入是一个Class ,我需要决定这个types是double还是integer,但是我需要同时支持Java使用的原始types和可装箱的可空types。 这个玩具的例子做我想做的事情: when(type) { java.lang.Double::class.java, Double::class.java -> TypesEnum.DOUBLE java.lang.Integer::class.java, Int::class.java -> TypesEnum.INT else -> throw IllegalArgumentException(“type”) } 但是,这种方法会从Kotlin编译器中产生以下警告: 警告:(22,13)Kotlin:Kotlin不应该使用这个类。 使用kotlin.Double代替。 警告:(23,13)Kotlin:Kotlin不应该使用这个类。 改用kotlin.Int。 但是, Int?::class.java是一个语法错误, 在先前的问题中提出的方法需要KClass而不是Class (并且.kotlin扩展方法在我的一些输入上崩溃)。 什么是正确的Kotlin方式来执行这种检查? 编辑:进一步的调查(由@ voddan的答案提示)已经显示,这个问题是Kotlin的typesreflection更古怪的一个怪异的症状: fun main(args: Array) { // ::class.java of Kotlin’s own Double type is just double println(Double::class) // -> class kotlin.Double println(Double::class.java) // -> double // […]

用于java方法的kotlinreflection接受null类数组

我有这样的java代码: Method m = device.getClass() .getMethod(“removeBondNative”, (Class[]) null); m.invoke(device, (Object[]) null); 我正在试着像Kotlin那样写下同样的东西: device.javaClass.getMethod(“removeBondNative”, null as Class).invoke(device, null as Any) 但我得到这个错误消息: Process: com.example.zemcd.toofxchange, PID: 17466 kotlin.TypeCastException: null cannot be cast to non-null type java.lang.Class at com.example.zemcd.toofxchange.BluetoothUtils$Companion.unPair(BluetoothUtils.kt:61) at com.example.zemcd.toofxchange.DeviceAdapter$DeviceHolder$bindItems$1$$special$$inlined$forEach$lambda$1.onClick(DeviceAdapter.kt:98) at android.view.View.performClick(View.java:5217) at android.view.View$PerformClick.run(View.java:21349) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5585) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) at […]