Kotlin使用反射调用构造函数

时间:2018-03-15 02:06:01

标签: 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)

1 个答案:

答案 0 :(得分:1)

在Kotlin中没有内置的枚举类型的方法,没有像Kodlin类似于Java的Class.forName()方法,我认为没有人做过{{3} }-style库专门用于Kotlin,这意味着您需要使用Java反射来获取Kotlin类,并且这开始听起来非常可怕。在我看来,它首先并不是很好 - 拥有类名的外部输入映射听起来像是一场安全噩梦。

根据您的使用案例,您可以使用几种方法。

首先,你可以实现一个合适的工厂(一个大的switch语句会做,构造函数的映射会稍微简洁一些),而不是试图从操作码构建你想要的构造函数的名称。我知道这可能是你想要避免的,但根据我的经验,你将遇到的问题比你避免的问题要大。

其次,如果您在某处使用反射,则可以将所有操作码实现创建为单个元类的嵌套类,然后您可以使用nestedClasses属性KClass来完成该操作。 1}},找到simpleName属性与您正在寻找的操作码匹配的那个。不过,这非常难看。您还需要包含Kotlin的反射运行时JAR,默认情况下不包含该内容。见Reflections