gpt4 book ai didi

reflection - Kotlin使用反射调用构造函数

转载 作者:行者123 更新时间:2023-12-02 13:38:43 25 4
gpt4 key购买 nike

对于简单的机器语言阅读器,我有许多类AaaInstruction,BbbInstruction,CccInstruction等,它们被作为aaaInstruction(v1,v2,v3)调用。想法是输入以以下形式给出:

aaa v1 v2 v3

bbb v1 v2 v3

ccc v1 v2 v3

在主类中,我使用以下代码:
var input = Scanner(System.`in`)

val instcode = input.next()

val cname: String = instcode.capitalize()+"Instruction"

然后如何调用 cname(v1,v2,v3)

最佳答案

Kotlin中没有内置的枚举类型的方法,没有Java的Class.forName()方法的Kotlin类似物,而且我认为还没有人专门为Kotlin创建Reflections -style库,这意味着您需要使用Java反射来获取Kotlin类,这听起来似乎很糟糕。首先,这并不是一件好事-将外部输入映射到类名听起来像是一场安全噩梦。

给定您的用例,您可以使用几种方法。

首先,您可以实现一个适当的工厂(一个大的switch语句会做,一个构造函数的映射会更简洁),而不是尝试从操作码中构建所需的构造函数的名称。我知道这可能是您要避免的问题,但是根据我的经验,避免出现的问题要比您要避免的问题大。

其次,如果您不愿意在某个地方使用反射,则可以将所有操作码实现创建为单个元类的嵌套类,然后可以使用nestedClassesKClass属性逐步查找,然后找到其simpleName属性的实例与您要查找的操作码匹配。不过,这很丑陋。您还需要包括Kotlin的反射运行时JAR(默认情况下不包含);参见http://kotlinlang.org/docs/reference/reflection.html

关于reflection - Kotlin使用反射调用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49290447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com