Kotlin 通过反射调用伴随函数

2023-11-29

我是科特林新手。面临反射和泛型的问题。下面是我的代码。

abstract class Action {
  fun sleep(body: Person.() -> Unit){
    var p = Person("a");
    p.body()
    println(p.name + " is zzzzzzz...")
  }
}

class Person(var name:String =""){
  companion object:Action();
}

inline fun <reified T> test(){
  val companionObject = T::class.companionObject
  if (companionObject != null) {
    println(companionObject.javaObjectType)
    val functionEx = companionObject.functions.filter { it.name.equals("sleep") }.first()
    // How to invoke functionEx with block and "this"
  }
}

fun main(args: Array<String>) {
  Person.sleep {
    this.name = "abc"
  }
  test<Person>()
}

我想调用sleep功能通过functionEx使用与 main 中相同的块代码。我正在努力应对this操作员。

我正在使用一些 API 并通过以下方式模拟了该问题Action and Person。所以不能改变他们的实现。它只是test功能在我的控制之下。


这应该有效:

inline fun <reified T> test() {
    val companionObject = T::class.companionObject
    if (companionObject != null) {
        val body: Person.() -> Unit = { println("body called on $name!") }
        val companionInstance = T::class.companionObjectInstance
        val functionEx = companionObject.functions.first { it.name.equals("sleep") }
        functionEx.call(companionInstance, body)
    }
}

使用以下方式调用该函数call(...),您需要将伴随对象实例作为第一个参数传递(它代表sleep函数的接收者)和一个实例功能类型 Person.() -> Unit作为第二个。

注意companionObject返回的不是伴生对象实例,而是它的实例KClass。要获取实例,请使用companionObjectInstance反而。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin 通过反射调用伴随函数 的相关文章

  • 如何使用分页库在回收器视图中添加日期分隔符?

    经过大量搜索 我知道使用常规适配器是可能的 但我不知道如何使用分页库来做到这一点 我不需要代码 只是一个线索 Example 要添加分隔符 您基本上有两个选择 基于视图 您显式地将分隔符作为 项目 包含在列表中 并为这些分隔符定义新的视图类
  • Kotlin 数据类中可变集合的防御性副本

    我想要一个接受只读列表的数据类 data class Notebook val notes List
  • 从 kotlin 多平台项目创建 fat jar

    我最近从旧的 1 2 多平台切换到 1 3 不同之处在于 每个多平台模块都有一个 build gradle 文件 我有 5 个 因此配置少了很多 但是 我似乎无法配置使用 jvm 平台的所有依赖项创建可运行的 fat jar 我曾经在 jv
  • Spring Boot 2.1重复reactiveMongoTemplate bean

    我有以下 Spring Boot Configuration class Configuration EnableReactiveMongoRepositories class MongoConfiguration AbstractReac
  • 如何使用 Jetpack Compose 按钮​​后面的视图检测单击?

    以下代码适用于 Jetbrains Desktop Compose 它显示了一张带有按钮的卡片 现在如果您单击该卡片 单击的卡片 将回显到控制台 如果您单击该按钮 它将回显 已单击按钮 但是 我正在寻找一种方法让卡检测按钮的点击 我想在不更
  • 在 Fragment 和 Activity 之外通过 Hilt 进行现场注入

    我想知道是否可以在片段或活动之外使用字段注入 我知道我可以使用构造函数注入 但是我想知道是否也可以使用字段注入 我认为 Dagger 是可能的 当我尝试用注入的东西做某事时yclass字段我收到此错误 lateinit property y
  • Typealias - 在 Kotlin 中组合多个接口

    我对 Kotlin 中的协议组合有点生疏 我只想通过声明自定义来组合多个接口typealias This doesn t work typealias MyType ReadableInterface WritableInterface 有
  • 如何将java库添加到kotlin本机

    所以我尝试使用intellij创建kotlin native应用程序 我在项目创建中选择了模板kotlin gt kotlin native 它创建了示例 gradle hello world 项目 下载所有依赖项后编译为exe文件并正常运
  • groovy 无法解析 kotlin 类

    由于我无法解决我遇到的问题kotlin 我决定回到groovy为了实现该插件 但是我遇到了这个问题 我有这样的项目结构 为了不重写所有类 我决定重用中实现的类kotlin 然而我的课FileProcessingCoreGroovy Down
  • 在 Kotlin 中以编程方式更改区域设置

    我有一些在 Java 中以编程方式更改语言环境的代码 但是当我的应用程序迁移到 Kotlin 时 我无法再更改区域设置 例如 Java 中的这段代码运行得非常好 public static final void setAppLocale S
  • 如何在Android首选项中正确接收和存储本地目录/路径?

    我想存储一个本地路径 内部或外部存储 用户可以在其中存储一些数据作为 Android 应用程序中的首选项 我希望用户在首选项中选择一个首选文件夹 默认文件夹是context externalMediaDirs它返回一个File我将其绝对路径
  • Kotlin 协程阻塞 Android 中的主线程

    我是 Kotlin 和协程的新手 我有一个fun在我的活动及其内部 检查User用户名和密码 如果为真 则返回Users object 一切都好 但是当我按下按钮时 我的活动被阻止并等待响应Users login 我用这个有趣的 priva
  • Kotlin JavaScript 到 TypeScript 定义文件

    我已经找到了ts2kt 库 https github com Kotlin ts2kt这将从任意位置创建 Kotlin 头文件 d ts文件 但是 我想朝相反的方向走 我想构建一个可以编译为 JavaScript 的 Kotlin 库 但我
  • Kotlin 中的单例类

    我想知道如何在 Kotlin 中创建一个单例类 以便我的 Util 类在每次应用程序执行时仅实例化一次 但是 当我将 Java 类转换为 kotlin 时 生成了以下代码 它是否正确 companion object private var
  • 在多模块项目中访问绑定适配器

    我有一个多模块项目 其中应用程序模块包含我的绑定适配器 而我的功能模块取决于我的应用程序模块 因为它是动态功能模块 应用程序 包含绑定适配器 gt 动态功能模块 存在布局的地方 我在所有模块中启用了数据绑定和 kapt 我无法成功构建应用程
  • Moshi 无法解析 nullable

    你好 希望你能帮助我 使用 kotlin Retrofit2 moshi 我从 https api spacexdata com v3 launches 获取数据并解析它 一切都很顺利 我得到的属性如下 flight number miss
  • 如何将 Android Room 数据库中的 Not Null 表列迁移为 Null

    我是 Android 房间库的新手 我需要将 Not Null 列迁移到 Null 但房间迁移只允许在 ALTER 表查询中添加或重命名 如何执行列迁移查询 Entity tableName vehicle detail data clas
  • 我在 android studio 中使用 kotlin 时出现错误

    为什么会出现这个错误 09 12 16 36 31 502 1886 1886 com getloction nourmedhat smartgate getlocation E AndroidRuntime 致命异常 main 进程 co
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 未捕获的 Kotlin 异常:kotlin.native.In CorrectDereferenceException:非法尝试访问非共享

    我尝试使用 Kotlin MPP Multiplatform 开发 Android 和 iOS 之间的共享库 但我面临着 iOS 中线程的问题 对于我在 iOS 中的应用程序 我在主线程中建立了对象 但它可能调用其他线程中的函数并抛出此异常

随机推荐

  • android:如何使用触摸和拖动创建不同的“屏幕”和它们之间的导航?

    我可以创建与主屏幕上相同类型的导航吗 也就是说 我想要可以使用触摸和拖动在不同的屏幕之间导航 我还没有看到任何相关内容 所以是时候问一下了 哦 我正在谈论 Android 的应用程序 没有任何内置内容 但您可以使用 ViewFlipper
  • 为什么当我打开 H2 控制台时,从 Java 添加的表不可见?

    我在Java中使用H2嵌入式数据库 在创建数据库并添加一些表和数据后 它被保存为我计算机目录中的文件 但是每当我使用 H2 控制台打开此文件时 它根本不显示任何表格 为什么桌子不在那里 我在我的 java 代码中使用这个 URL jdbc
  • Java QueryDsl代码生成不生成Q类

    我正在制作一个 Spring 项目 其中我使用 QueryDsl 作为实体 我从几个月前开始接手这个项目 其中我已经有 1 个生成的类 QUser 现在我创建了一个名为 Permission 的新实体 并修改了 User 实体 当我构建项目
  • 在 Dymola 中编译大型数组

    请考虑以下小型 Modelica 模型和功能 model VectorizeDemo parameter Integer na 5 final parameter Integer nb 2 na final parameter Real a
  • 如何将数组分割成块,但让它一个接一个地填充每个数组

    我使用这个函数来创建数组块 function chunkArray myArray chunk size let results while myArray length results push myArray splice 0 chun
  • iOS5 的 Json 解析器示例

    我在 iOS5 中创建了一个应用程序 我想在网络服务器上存储和检索数据 为此我想使用 JSON 解析器 我使用了 ray wenderlich 为 ios4 提供的演示 我听说ios 5 有一些现成的框架 那么有人对此有任何想法吗 我正在使
  • 将下拉列表的值传递到文本框

    我的视图中有一个下拉列表 一个提交按钮和一个文本框 我想在单击提交按钮或 dropdownlist 的 onChange 事件时将 dropdownlist 的选定值传递到文本框 我怎样才能实现这个目标 我解决如下 div Html Dro
  • 黑客挑战 - 定位代码中的漏洞

    我的朋友最近完成了一项黑客挑战并将其发送给我 二进制文件和源代码 在向他寻求建议之前我想先在这里问一下 因为我想自己做 我一直在经历它 但我正在努力寻找漏洞 include
  • mvc:将单选按钮的值添加到集合中并保存到数据库

    我有一个带有文本框的表单和一些带有单选按钮的问题 我希望此表单的用户检查每个单选按钮 这是强制性的 我想将检查是或否的值与每个问题的名称或 ID 一起使用实体框架写入数据库 如果我知道如何将此信息收集到集合中 我可以写入数据库 请问如何将这
  • 在单元测试代码中访问部署目标

    我需要知道单元测试用例中的部署目标 有没有办法以编程方式获取 iOS 部署目标 使用 Objective C This 可作为 Xcode 构建变量使用 called IPHONEOS DEPLOYMENT TARGET 您需要做的就是创建
  • 有没有人找到一种在 SQL 数据库中存储 BSON ObjectId 值的有效方法?

    我们正在将一些数据从 MySQL 迁移到 Mongo 并为一些数据库表添加了额外的字段ObjectId迁移的数据对象的值 目前我们将它们存储为 varchar 24 latin1 general ci 效果很好 然而 为了高效存储 索引 我
  • 响应式水平滚动菜单

    http healthunit com当您从移动电话设备查看时 屏幕顶部有一个干净的水平滚动菜单 由于我正在重新设计一个包含大量导航元素的网站 我正在尝试模仿相同的功能 要求 左右滚动单击选项 居中列表项选项在空间中居中 一次只能看到一个列
  • 使用 python 的 re 模块正确解析字符串文字

    我正在尝试为我用 Python 编写的 javascript 预处理器添加一些轻量级降价支持 在大多数情况下 它是有效的 但有时我使用的正则表达式表现得有点奇怪 我认为这与原始字符串和转义序列有关 正则表达式是
  • Echarts:绘制信号的方差

    我想在图表中绘制多个信号的方差 或者基本上填充上部信号和下部信号之间的空间 是否可以创建这样的图表 我看到了置信带示例 https echarts apache org examples en editor html c confidenc
  • 向 JPanel 添加椭圆形

    这是我的简单代码 我真的不知道如何将绘制的椭圆添加到JPanel 我以前画过一些画 但我从未使用过构造函数 所以我不知道 public class Buffer extends JPanel public JFrame frame publ
  • 我在记录时崩溃:“所需条件为假:format.sampleRate == hwFormat.sampleRate”afterweb rtc 调用

    我的记录工作正常 但问题是在 WebRTC 调用之后 我崩溃了 所需条件为 false format sampleRate hwFormat sampleRate 这是我开始崩溃和 installTap 的方式 func startReco
  • asp .Net 中的 JavaScript

    我在我的 asp Net 页面中收到 WebResource 错误 var pendingCallbacks new Array Microsoft JScript runtime error Array is undefined 我不知道
  • 无法删除以前的 doSMP 队列

    我正在尝试使用 doSMP 当我尝试时w lt startWorkers 4 我收到错误 1 在startWorkers workerCount 4 中 存在使用 doSMP1 的现有 doSMP 会话 实际上是 doSMP1 doSMP8
  • 在 GMAIL 中预填充大量正文文本时出现请求 URI 太长错误

    这是后续this问题 我正在构建 Google Apps 应用程序的地方 我可以使用以下网址从我的应用程序调用 Gmail 撰写消息页面 但是 当我尝试在 body 参数中传递很长的一行文本 例如回复消息正文 时 我从 Gmail 收到一条
  • Kotlin 通过反射调用伴随函数

    我是科特林新手 面临反射和泛型的问题 下面是我的代码 abstract class Action fun sleep body Person gt Unit var p Person a p body println p name is z