从字符串实例化 Kotlin class

Instantiate Kotlin class from string

我有一个 class 列表:

val availableClasses = listOf<Whatever>(
    classA(),
    classB(),
    classC()
)

我使用以下方法从此列表中随机选择一项:

private var selection: Whatever = availableClasses.random()

不幸的是,我认为这种方法是在加载列表时实例化列表中包含的每个 class。

我希望通过用字符串列表替换 classes 列表来解决这个问题:

val availableClasses = listOf<String>(
    "classA",
    "classB",
    "classC"
)

然后,一旦我选择了一个字符串,就只实例化那个字符串;类似于:

private var selection: String = availableClasses.random()
// pseudo-code
val chosenClass = selection.toClass()

我可以使用带有 getattr 函数的字符串在 Python 中引用 classes。

在 Kotlin 中有这样的可能吗?

我也愿意接受更好的方法来解决这个问题。

通过字符串名称实例化 classes 比使用构造函数更容易出错,因为它依赖于使用完全限定、拼写正确的名称,并且 class 具有特定的构造函数 (为空,或带有特定参数)。所以它可以做到,但是当有更安全的方法时应该避免(如果你做错了,编译器会给你一个错误的方式,而不是只有在你 运行编译后的程序)。

如果我没理解错的话,您想要一个 class 列表,这些列表将一次只随机实例化一个。一种方法是列出 class 个构造函数。

val classConstructors = listOf<() -> Any>(
    ::ClassA,
    ::ClassB,
    ::ClassC
)

val randomInstantiatedClass = classConstructors.random()()