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"
val parsePackageMethod = getMethod2(clsName, "parsePackage", paramClsArray)
注意:这里采用 paramClsArray (没有 * 展开) ,而不是 *paramClsArray 。
|