使用vararg枚举参数将未知枚举类型传递给方法

时间:2019-11-27 13:37:34

标签: generics kotlin reflection

我有一个通过反射找到的方法,该方法带有一个vararg itemFlags: ItemFlag参数。我有枚举类型ItemFlag,我也是通过反射发现的。如果类型未知,如何使用类型为ItemFlag的类型数组调用该方法?我尝试用枚举实例创建一个Array<Any>并将其作为参数传递,但是它抛出IllegalArgumentException并显示一条消息argument type mismatch

我的代码(例如修剪):

val itemStack = ...
val itemMeta = ...

val enumClass = Class.forName("org.bukkit.inventory.ItemFlag")
val enumInstance = (enumClass!!.enumConstants as Array<Enum<*>>).first { it.name == "HIDE_ENCHANTS" }
val addItemFlagsMethod = ItemMeta::class.java.declaredMethods.first { method -> method.name == "addItemFlags" }

// addItemFlags only parameter is vararg flags: ItemFlag
addItemFlagsMethod!!.invoke(itemMeta, arrayOf(enumInstance))

1 个答案:

答案 0 :(得分:1)

我认为这应该可行:

val arr = java.lang.reflect.Array.newInstance(enumClass, 1)
java.lang.reflect.Array.set(arr, 0, enumInstance)
addItemFlagsMethod!!.invoke(itemMeta, arr)

请参见documentation