Tag: 反射

如何在类中找到带注释的方法?

给出一个注释 @Target(AnnotationTarget.FUNCTION) @Retention(AnnotationRetention.RUNTIME) annotation class MyAnnotation 如何找到这个注释的方法? 这是我得到了多少: val cls = myObject.javaClass.kotlin val found = cls.memberFunctions.filter { it.annotations.contains( ??? ) }

检查功能是否扩展

给定一个KFunction ,我该如何检查它是否是扩展函数? 我知道的唯一方法是检查function.extensionReceiverParameter返回null 。 有没有其他的或推荐的方法?

如何用Kotlin反射改变成员字段?

我正在从Java移植到Kotlin。 这个类声明了数百个对象。 每个对象都有一个名称属性,该名称属性与对象的声明变量名称相同。 Java反射允许通过反射使用声明的名称来设置对象成员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<String>) { println(MyTestObject.Anton.name) // name not yet initialized // Initialize 'name' with the […]

配置kotlin反射,class.java不起作用

所以我把kotlin更新到1.0.0-rc-1036,反射被破坏了。 这段代码在测试版中适用于我: ApiInterface::class.java 但现在我得到未解决的引用.java。 我在文档中发现,kotlin-reflect不是标准库的一部分(我猜他们最近移动了它,但是我没有在发行说明中找到任何东西)。 所以我添加了编译和类路径'org.jetbrains.kotlin:kotlin-reflect:1.0.0-rc-1036',但它仍然不起作用。 如何解决这个问题?

我如何通过反思来获得物业的价值?

我想使用具有一些注释的所有属性的值。 在大多数情况下,我的代码工作,我得到所有的属性,只拿那些注释。 private inline fun <reified A : Annotation> (target: Any) { target::class.memberProperties .filter { it.annotations.any { annotation -> annotation is A } } .forEach { // How do I get the value here? } } 我想使用it.get(…)但期望一个Nothing作为参数。 getter 。 调用它it.call(target)确实有效,但是看起来不对,因为有一个我不知道如何调用的调用。 那么获取属性值的正确方法是什么?

在Kotlin中动态获取函数名称

如何在Kotlin中动态获取名称函数? 即: fun myFunc11() { println("Very useful function 11") } val funcName = "myFunc" + 11 val funcRef = getFunction(funcName) funcRef() 编辑:接受的答案似乎是正确的,但代码目前正在碰撞Kotlin中的一些错误。 提交的错误报告: https : //youtrack.jetbrains.com/issue/KT-10690

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

现在,我正在使用kotlin作为我的主要编程语言,我正试图简化Android的Recyclerview实现逻辑,我被困在以下几点: 比方说,我已经定义了下面的ViewHolder类,通过构造函数中的方法引用传播点击位置事件。 class CustomViewHolder(itemView: View, val onClick: (Int) -> Unit)) : RecyclerView.ViewHolder(itemView){ itemView.setOnClickListener { onClick.invoke(adapterPosition) } } 我怎样才能构建一个在构造函数中有一个方法引用的泛型类的实例? 我的recyclerview实现在构造函数中有一个泛型类,也是一个实体引用,可以通过在onCreateViewHolder上的反射来创建我的CustomViewHolder类的实例: class CustomAdapter<HolderClassGeneric>(val entityClass: Class<HolderClassGeneric>) : RecyclerView.Adapter<HolderClassGeneric>() { /* 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, […]

在未知(Any)对象上调用kclass.memberProperties是否安全?

我认为只需访问KClass对象的members字段KClass 。 但是我没有发现一个案子。 两个测试都会抛出异常 @Test fun mapProperties() { val map = mapOf("a" to "b") val cls = map.javaClass.kotlin cls.members } 抛出: kotlin.reflect.KotlinReflectionInternalError: Incorrect resolution sequence for Java field public open val values: kotlin.collections.MutableCollection<(V..V?)> defined in java.util.Collections.SingletonMap[JavaPropertyDescriptor@10163d6] @Test fun mapProperties2() { val map = mapOf("a" to "b") val cls = clsByReified(map) cls.members } inline fun <reified […]

蓝牙客户端Socket每次得到相同的异常

我正在写一个Android应用程序,主要是在Kotlin应该扫描蓝牙设备,并与他们配对。 我也希望它在后台运行一个蓝牙服务器套接字来等待连接尝试。 不过,当我试图调用BluetoothSocket.connect()方法时,我仍然遇到了同样的异常。 例外是: 10-10 20:07:57.917 18643-27894/com.example.zemcd.toofxchange E/Pairing Thread: error connecting java.io.IOException: read failed, socket might closed or timeout, read ret: -1 at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:754) at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:766) at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:388) at com.example.zemcd.toofxchange.PairingThread.run(BluetoothUtils.kt:83) 我读到,这可以解决类似的代码 btSocket = device.javaClass.getMethod("createRFcommSocket", Int::class).invoke(device, 1) as BluetoothSocket 但是这不起作用。 它导致应用程序崩溃,由NoSuchMethod引起的ReflectException 。 此外,我已经读过,这不是一个原因发布的方法,我想尝试使用发布的createRFcommSocketToServiceRecord()方法。 我不确定从哪里去,或者是什么导致IOException 。 此外,我甚至从来没有去配对屏幕。 我试图找出这个异常的原因,以及如何解决这个问题。 我的代码: class BluetoothUtils { companion object { val _UUID […]

我想检测一个JVM类是否是一个Kotlin类

如果我遇到一个Kotlin类,与一般的Java类相比,我想要做特殊的功能。 我如何检测它是否是Kotlin类? 我希望调用someClass.kotlin会抛出异常,否则如果类不是Kotlin。 但它包装Java类就好了。 然后我注意到,如果我做一些someClass.kotlin.primaryConstructor它似乎是null的所有Java类,即使他们有一个默认的构造函数,是一个好的标记? 但是,Kotlin类也可以返回null吗? 什么是最好的方式来说“这是一个科特林级?”