首页 > 其他分享 >Kotlin反射从父类获取子类成员属性

Kotlin反射从父类获取子类成员属性

时间:2023-10-12 11:03:25浏览次数:35  
标签:childs val 子类 pc toString Kotlin 父类 class

背景

有部分需求需要反射获取相关信息,例如,由于子类太多100+,需要在父类写toString方法涵盖子类的相关信息

实现过程

  1. 逻辑通过反射获取子类构造方法的参数
  2. 通过当前实例调用参数的获取方法,获取参数值
  3. 在父类的toString中输出和组建toString

代码

  1. 获取构造方法的参数
val pc = this::class.primaryConstructor
  1. 获取参数值
val props = this::class.memberProperties
  1. 组建数据
var childs: List<String> = emptyList()
        if(pc != null){
            childs = pc.parameters.map { pa -> props.find { it.name == pa.name }?.getter?.call(this).toString() }
        }
        return "A(${childs.joinToString()})"
  1. 全部代码
open class A {
    override fun toString(): String {
        val pc = this::class.primaryConstructor
        val props = this::class.memberProperties
        var childs: List<String> = emptyList()
        if(pc != null){
            childs = pc.parameters.map { pa -> props.find { it.name == pa.name }?.getter?.call(this).toString() }
        }
        return "A(${childs.joinToString()})"
    }
}
class B(val a: String, val b: String) : A()

fun main() {
    println(B("aaa", "bbb").toString())
}

标签:childs,val,子类,pc,toString,Kotlin,父类,class
From: https://www.cnblogs.com/terrency/p/17758980.html

相关文章

  • kotlin基础知识
    一、if的使用1、if和java不一样的是:if是有结果的表达式函数的返回值可以是:returnif(a>b)aelseb;类似于java的returna>b?a:b;可能是这个原因所以kotlin没有这个三目运算符 二、函数体kotlin除了循环外,大部分控制结构都是表达式体1、函数体分为:代码块体和表......
  • Kotlin协程的异常处理
    捕获异常Kotlin协程中执行的代码如果可能发生异常,最简单直接的办法也是可以通过try-catch语句来捕获异常GlobalScope.launch{try{println(1/0)}catch(e:Exception){//cancatchexception}}但try-catch只能捕获该协程代码块中......
  • 无涯教程-Kotlin - 简介
    Kotlin是一种在Java虚拟机上运行的静态类型编程语言,它也可以被编译成为JavaScript源代码。它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言,其名称来自于圣彼得堡附近的科特林岛。2012年1月,著名期刊《Dr.Dobb'sJournal》中Kotlin被认定为该月的最佳语言。虽然......
  • kotlin协程的基础笔记
    导包在Android项目中需要导入:implementation"org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"implementation"org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3"通过maven树可以分析:|||\---org.jetbrains.kotlinx:kotlinx-coroutine......
  • 使用 C++11 原子类型 `std::atomic_flag` 实现的自旋锁
    使用C++11原子类型std::atomic_flag实现的自旋锁:#include<atomic>classSpinlock{public:Spinlock():flag(ATOMIC_FLAG_INIT){}voidlock(){while(flag.test_and_set(std::memory_order_acquire));}voidunlock(){flag.cl......
  • 如何查找python对象或类的父类子类以及用法
    一个类其方法和数据的来源可以是自定义,也可以是继承自各级父类。通过dir查看其方法和属性,通过help查看其使用方法。特别地,可通过Base和subclass寻找其父类和其他子类。亦可通过文档研究其继承关系。文档不仅包含自身类,也包括其父类的属性方法。  python>>>help(op("/projec......
  • Kotlin | 在for、forEach循环中正确的使用break、continue
    Kotlin有三种结构化跳转表达式:return:默认从最直接包围它的函数或者匿名函数返回。break:终止最直接包围它的循环。continue:继续下一次最直接包围它的循环。for循环中使用break、continuefor(iin1..5){if(i==3)break//1这里分别使用breakcontinuereturnprintl......
  • Kotlin-大师班 第五章-随笔
    数组Array1.基础数据类型Array 2.arrayOf:基础类型、字符串、自定义类对象,甚至类,甚至不同类型放在这一个数组里。 3.不可变集合三兄弟,除了他们仨后面的都可变。 4.可变集合ArrayList,arrayListOf,mutabalListOfmutableSetOf,hashSetOfHashMap,hashMapOf,mutableMa......
  • Kotlin 基础语法
    Kotlin文件以.kt为后缀。包声明包的声明应处于源文件顶部:packagemy.demoimportjava.util.*//……kotlin源文件不需要相匹配的目录和包,源文件可以放在任何文件目录。如果没有指定包,默认为 default 包。默认导入有多个包会默认导入到每个Kotlin文件中:kotlin.*kotlin.an......
  • Kotlin第一弹:Kotlin详细介绍
    https://blog.csdn.net/m0_58941767/article/details/126679953 前言Kotlin是什么?一、为什么优先使用Kotlin进行Android开发?二、Kotlin优先意味着什么?三、Kotlin能做什么?四、我们也使用Kotlin五、Kotlin常见问题六、Kotlin必知必会总结  Kotlin是什么?Kotlin是一......