Kotlin 的反射

作者: 代瑶 | 来源:发表于2018-06-06 09:32 被阅读0次

(val obj: Any) 作为参数传过来

val clazz = obj::class
        clazz.declaredMemberProperties.forEach { prop ->
            prop.findAnnotation<Value>() ?: return@forEach
            val mutableProp = try {
                prop as KMutableProperty<*>
            } catch (e: Exception) {
                null
            } ?: return@forEach

            //假如要改变var  并且它是String类型  就这么调用
            //  val javaSetter = mutableProp.javaSetter
            //  javaSetter?.invoke(obj, "反射字段")
         }

据说kotlin 反射很慢,相对java 来说 所以我们可以用java来实现,实现的注解MyValue 一定要是java类
declaredFields 是得到当前类的所有字段 getFields 是得到所有public 字段包括父类

    val clazz = obj::class.java
        for (declaredField in clazz.declaredFields) {
            if (declaredField.isAnnotationPresent(MyValue::class.java)) {
                val forName = Class.forName(declaredField.type.name)
                val newInstance = forName.newInstance()
                declaredField.set(obj, newInstance)
            }
        }
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD) //次注解只能作用于方法上
public @interface MyValue {

}

在BaseActivity 中定义一个P 泛型 然后可以这样反射得到类型并赋值

val clazz = obj::class.java
        for (declaredField in clazz.fields) {
            if (declaredField.isAnnotationPresent(MyValue::class.java)) {

                val type = (clazz.genericSuperclass as ParameterizedTypeImpl)
                        .actualTypeArguments[0]
                        as Class<*>
//                val forName = Class.forName(declaredField.type.name)
                val newInstance = type.newInstance()
                declaredField.set(obj, newInstance)
            }
        }

最终实现自动反射得到P和V代码

 val clazz = obj::class.java
        for (declaredField in clazz.fields) {
            if (declaredField.isAnnotationPresent(InjectP::class.java)) {
                val classType = (clazz.genericSuperclass as ParameterizedTypeImpl)
                        .actualTypeArguments[0]
                        as Class<*>
                val presenterInstance = classType.newInstance()
                declaredField.set(obj, presenterInstance)

                //给Presenter
                val presenter = presenterInstance as IBaseContract.Presenter
                val viewField = presenter::class.java.getField("mView")
                viewField.set(presenter, obj)
            }
        }

相关文章

  • Kotlin学习笔记(六)-反射

    [toc] 前言 这一节为Kotlin反射,主要是在Kotlin中时用Java-Api来实现反射,使用Kotlin...

  • Kotlin和Java互相调用(二)

    Kotlin反射 正如在前面不少代码中所见到的, Kotlin也提供了反射 API,这些反射 API可以方便程序在...

  • Java 反射 VS Kotlin 反射

    Kotlin 跟 Java 可以无缝衔接,因此 Kotlin 能够使用 Java 的反射机制。另外,Kotlin ...

  • Kotlin Json 序列化1 - 基本功能实现

    参考: https://github.com/yole/jkid 预备知识 Kotlin 反射; Kotlin 注...

  • Kotlin使用注解

    Kotlin的反射也提供了一些支持注解的API。 一、提取注解信息 Kotlin使用kotlin.Annotion...

  • Kotlin 反射

    反射是语言与库中的一组功能, 可以在运行时刻获取程序本身的信息。 类引用 要得到一个静态的已知的 Kotlin 类...

  • Kotlin反射

    Kotlin把函数和属性当成“一等公民”,并可通过反射直接获取函数、属性的引用。 一、类引用 Kotlin的类引用...

  • Kotlin反射

    简单记录https://www.cnblogs.com/liumaowu/p/9413264.html

  • Kotlin反射

    Kotlin中KClass反射 Kotlin是函数式编程语言,它有一些独有的特性,例如,在Kotlin中的Prop...

  • Kotlin 的反射

    (val obj: Any) 作为参数传过来 据说kotlin 反射很慢,相对java 来说 所以我们可以用...

网友评论

    本文标题:Kotlin 的反射

    本文链接:https://www.haomeiwen.com/subject/dfjmsftx.html