Tag: 反射

Kotlin:isAssignableFrom和反射类型检查

在Kotlin(1.0.6)中,通过反射我需要遍历一个类的成员(我们称之为Foo ),并根据返回类型做一些事情。 我可以写下面的,这是有效的: Foo::class.members{ m -> if(Integer.TYPE.isAssignableFrom(m.returnType.javaType as Class<*>)){ //do something here } else if … } 问题是if语句(处理kotlin.Int )相当难看。 Kotlin有没有更好的方法可以实现相同的结果,而不必直接依赖Java API?

Kotlin反射+泛型

编辑1:改变标题,我的坏。 我有一个界面事件 : interface Event 还有一些实现它的类,比如CustomEvent : class CustomEvent : Event { … } 我一直在尝试做的是:给定一个有事件作为参数的方法(所以,任何实现Event接口的类),像这样 fun onCustomEvent(event: CustomEvent) { … } ,我想将该事件添加到列表中。 因此,这个清单最终将会持有一堆不同的事件。 在Java中,我相信它会是这样的(可能不是100%准确的): List<Class<? extends Event>> eventsList; …. Class<?> param = methodThatHasSomeEventAsParam.parameterTypes[0]; if (Event.class.isAssignableFrom(param)) { Class<? extends Event> actualParam = (Class<? extends Event>) param; eventsList.add(actualParam); // Adds CustomEvent to the events list. } 但至于Kotlin,我真的不知道如何正确使用泛型,具体是什么将是正确的翻译方式 […]

使用反射来传递和修改一个基本而不使用数组

在一个imgui 端口上工作,我总是使用原始数组来模拟c ++指针/地址传递。 例如: checkbox("Anti-aliased lines", bool.apply { set(0, style.antiAliasedLines) }) style.antiAliasedLines = bool[0] 其中bool: BooleanArray 我只是探讨了直接传递字段的可能性,而不是c ++: ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); 科特林: checkbox("Anti-aliased lines", style::antiAliasedLines }) 我只需要在checkbox()上容纳一个对应的KMutableProperty0<Boolean> ,并且我也进行了double检查,以便可以在同一个函数中设置该字段: get(): Boolean和set(Boolean) 我的顾虑是: 这与Java的发挥不错? 如果我沿着这条路走下去的话,有没有什么禁忌我应该知道的? 比如演出什么的? 因为我有这样的感觉,因为这种方法是不知羞耻和肮脏的

Java:我如何通过反射获得构造函数的钩子/回调?

是否有可能通过反射获得构造函数的钩子/回调? 我的用例是使用表达式作为函数。 在像Kotlin这样的语言中,浮动表达式完全可以与扩展运算符结合使用,在某些情况下,它可以使语法变得非常简单。 这不能用代码实现完成,因为语法必须完全没有样板。

当不在JVM上运行时,如何获得对Kotlin KClass的引用?

定位Javascript和本地java.lang.Class.forName()不可用时。 我如何在这些环境中获得KClass ?

获得当前课程

我怎样才能得到科特林当前的课程。 例如,如果有抽象类“动物”和孩子类“狗”(女巫是“动物”的孩子),我怎样才能得到“动物”中的“狗”类。 我现在不用巫婆班就会用“动物” 我已经尝试使用: this::class (什么可以在Java中): this.getClass() 但是这个方法是根据我的IDE不可用的。 最好的祝福 乔纳斯·弗朗茨

java.lang.IllegalArgumentException:Callable需要4个参数,但提供了3个参数

我试图调用一个函数使用Kotlin反射,但我得到的错误: java.lang.IllegalArgumentException:Callable需要4个参数,但提供了3个参数。 这是做反射电话的代码: annotation.listeners.forEach { listener: KClass<*> -> listener.functions.forEach { function: KFunction<*> -> if (function.name == "before") { function.call(annotation.action, request, response) } } } 我已经为listener和function添加了类型,只是为了使问题更具可读性。 这是被调用的方法: fun before(action: String, request: RestRequest, response: RestResponse) 为了仔细检查我的类型是否正确,我做了这个: if (function.name == "before") { println(annotation.action::class) println(request::class) println(response::class) } 这将打印(这是before函数所需的正确类型): class kotlin.String class com.mycompany.RestRequest class com.mycompany.RestResponse 第四个参数应该是什么?

instance :: class.java与instance.javaClass

鉴于Kotlin 1.1。 对于某个类的instance , instance::class.java和instance.javaClass似乎几乎是等价的: val i = 0 println(i::class.java) // int println(i.javaClass) // int println(i::class.java === i.javaClass) // true 但是有一个微妙的差别: val c1: Class<out Int> = i::class.java val c2: Class<Int> = i.javaClass instance.javaClass可以忽略不计,但是instance::class.java与一个类型的相应用法更加一致。 虽然您可以在某些类型上使用.javaClass ,但结果可能不是您所期望的: println(i::class.java === Int::class.java) // true println(i.javaClass === Int.javaClass) // false println(Int::class.java === Int.javaClass) // false println(Int.javaClass) // class kotlin.jvm.internal.IntCompanionObject 所以,我认为最好不要使用.javaClass来获得更好的一致性。 […]

我如何通过反射在Kotlin中设置伴随对象的属性?

当我有一个伴侣对象的类,是否有可能使用反射设置此伴随对象的属性? 我可以用普通的属性来做,但是在伴侣对象上失败: import kotlin.reflect.KMutableProperty import kotlin.reflect.full.companionObject import kotlin.reflect.full.memberProperties class WithProperty { lateinit var prop: String companion object { lateinit var companionProp: String } fun test() = "$companionProp $prop" } fun main(args: Array<String>) { val obj = WithProperty() val prop = obj::class.memberProperties.filter { it.name == "prop" }.first() if (prop is KMutableProperty<*>) { prop.setter.call(obj, "world") } val […]

Kotlin:比较不同目标对象的属性值和(外)反射

我想比较数据类的多个实例之间的值,以便我知道哪个值更改: data class A(val name : String) val firstA = A("hello") val secondA = A("you") if (secondA.name.changed(firstA)) { // Do something } 我可以以某种方式访问.name的属性函数,并在没有明确定义的情况下在另一个目标值(在本例中为firstA)上执行它? 可以在这里委托帮助,或者如何解决这个问题,而不是反思?