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

标签 reflection constructor kotlin user-input invoke

对于简单的机器语言阅读器,我有许多类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/

相关文章:

java - 如何在 Java 中将 Field 转换为 Set 类?

c# - 在 C# 中创建类型列表

C++:类和构造函数:使用初始化列表来初始化字段

c++ - 这在 C++ 构造函数中有什么作用?

kotlin - setter 不修改二维数组

java - Kotlin 协程或任何协程在执行 DB 操作时是否会阻塞线程?

c# - 可以隐藏属性上的属性吗?

java - 使用反射API获取字段名称和值

java - 在处理中实例化变量异常

javascript - Kotlin/JS,Gradle 插件 : Unable to load '@webpack-cli/serve' command