Kotlin 中处理 Java Class>... 或者 Class[] 的 3 种方式
文章目录- 场景 1: 变长参数 Class>... parameterTypes
- 方式 1: 直接输入 class
- 方式 2:通过 arrayOf
() - 方式 3: 通过 Array
()
- 场景 2: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这样来创建 Array
val paramClsArray: Array
注意:这里的 *paramClsArray , 这个星号 * 是展开操作,把 Array
val clsName = "android.content.pm.PackageParser" val paramClsArray: Array方式 3: 通过 Array> = arrayOf >(File::class.java, Int::class.java) val parsePackageMethod = getMethod(clsName, "parsePackage", *paramClsArray)
这里用到了 Array
Array
调用 Array
同样需要对数组进行展开: *paramClsArray
val clsName = "android.content.pm.PackageParser" val paramClsArray: Array场景 2:Class>[] parameterTypes> = Array >(2) { it -> it.javaClass } paramClsArray[0] = File::class.java paramClsArray[1] = Int::class.java val parsePackageMethod = getMethod(clsName, "parsePackage", *paramClsArray)
public static Method getMethod2(String clsName, String methodName, Class>[] parameterTypes)
与场景 1 的区别是,场景 1 采用变长参数 Class>... parameterTypes,而场景 2 采用数组 Class>[] parameterTypes。
在此场景中,在 Kotlin 中调用 getMethod2() 不需要对 Array
例如,
val clsName = "android.content.pm.PackageParser" // paramClsArray 的代码,见场景 1 中的代码 val parsePackageMethod = getMethod2(clsName, "parsePackage", paramClsArray)
注意:这里采用 paramClsArray(没有 * 展开) ,而不是 *paramClsArray。



