我有一个通过反射找到的方法,该方法带有一个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))
答案 0 :(得分:1)
我认为这应该可行:
val arr = java.lang.reflect.Array.newInstance(enumClass, 1)
java.lang.reflect.Array.set(arr, 0, enumInstance)
addItemFlagsMethod!!.invoke(itemMeta, arr)
请参见documentation。