Kotlin 中处理 Java Class<?>...
或者 Class[]
的 3 种方式
文章目录
场景 1: 变长参数 Class<?>… parameterTypes
Java 代码:
public static Method getMethod(String clsName, String methodName, Class<?>... parameterTypes)
在 Kotlin 代码中,通过调用上面的 getMethod()
来获取 android.content.pm.PackageParser
中的 public Package parsePackage(File packageFile, int flags)
方式 1: 直接输入 class
这里,直接把 File::class.java, Int::class.java
写到实参中。
val clsName = "android.content.pm.PackageParser"
val parsePackageMethod = getMethod(clsName, "parsePackage",
File::class.java, Int::class.java)
这里的 File::class
是 kotlin 的类 KClass
,File::class.java
表示从 KClass 中取到 Java 的 class,对应于 Java 中的 File.class
。
方式 2:通过 arrayOf<Class>()
这样来创建 Array<Class>
:
val paramClsArray: Array<Class<*>> = arrayOf<Class<*>>(File::class.java, Int::class.java)
注意:这里的 *paramClsArray
, 这个星号 *
是展开操作,把 Array<Class>
数组中的每一项展开, *paramClsArray
展开后是 File::class.java, Int::class.java
,跟方式 1 的效果相同。
val clsName = "android.content.pm.PackageParser"
val paramClsArray: Array<Class<*>> = arrayOf<Class<*>>(File::class.java, Int::class.java)
val parsePackageMethod = getMethod(clsName, "parsePackage", *paramClsArray)
方式 3: 通过 Array<Class>()
这里用到了 Array<Class<*>>()
的构造方法: public inline constructor(size: Int, init: (Int) -> T)
。
Array<Class<*>>(2) { it -> it.javaClass }
调用 Array<Class<*>>
的构造方法,其中, 2
是数组大小, { it -> it.javaClass }
为 init
方法,对 Array<Class>
数组中的每一项获取其 java class。
同样需要对数组进行展开: *paramClsArray
val clsName = "android.content.pm.PackageParser"
val paramClsArray: Array<Class<*>> = Array<Class<*>>(2) { it -> it.javaClass }
paramClsArray[0] = File::class.java
paramClsArray[1] = Int::class.java
val parsePackageMethod = getMethod(clsName, "parsePackage", *paramClsArray)
场景 2:Class<?>[] parameterTypes
public static Method getMethod2(String clsName, String methodName, Class<?>[] parameterTypes)
与场景 1 的区别是,场景 1 采用变长参数 Class<?>... parameterTypes
,而场景 2 采用数组 Class<?>[] parameterTypes
。
在此场景中,在 Kotlin 中调用 getMethod2()
不需要对 Array<Class<*>>
进行展开。
例如,
val clsName = "android.content.pm.PackageParser"
// paramClsArray 的代码,见场景 1 中的代码
val parsePackageMethod = getMethod2(clsName, "parsePackage", paramClsArray)
注意:这里采用 paramClsArray
(没有 *
展开) ,而不是 *paramClsArray
。