对于简单的机器语言阅读器,我有许多类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语句会做,一个构造函数的映射会更简洁),而不是尝试从操作码中构建所需的构造函数的名称。我知道这可能是您要避免的问题,但是根据我的经验,避免出现的问题要比您要避免的问题大。
其次,如果您不愿意在某个地方使用反射,则可以将所有操作码实现创建为单个元类的嵌套类,然后可以使用nestedClasses
的KClass
属性逐步查找,然后找到其simpleName
属性的实例与您要查找的操作码匹配。不过,这很丑陋。您还需要包括Kotlin的反射运行时JAR(默认情况下不包含);参见http://kotlinlang.org/docs/reference/reflection.html。
关于reflection - Kotlin使用反射调用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49290447/