Kotlin 中处理 Java Class 数组的 3 种方式

Kotlin 中处理 Java Class 数组的 3 种方式,第1张

Kotlin 中处理 Java Class... 或者 Class[] 的 3 种方式

文章目录
    • 场景 1: 变长参数 Class... parameterTypes
      • 方式 1: 直接输入 class
      • 方式 2:通过 arrayOf()
      • 方式 3: 通过 Array()
    • 场景 2:Class[] parameterTypes

场景 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::classkotlin 的类 KClassFile::class.java 表示从 KClass 中取到 Java 的 class,对应于 Java 中的 File.class

方式 2:通过 arrayOf()

这样来创建 Array:
val paramClsArray: Array> = arrayOf>(File::class.java, Int::class.java)

注意:这里的 *paramClsArray , 这个星号 * 是展开 *** 作,把 Array 数组中的每一项展开, *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()

这里用到了 Array>() 的构造方法: public inline constructor(size: Int, init: (Int) -> T)

Array>(2) { it -> it.javaClass }
调用 Array> 的构造方法,其中, 2 是数组大小, { it -> it.javaClass }init 方法,对 Array 数组中的每一项获取其 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> 进行展开。

例如,

val clsName = "android.content.pm.PackageParser"
// paramClsArray 的代码,见场景 1 中的代码
val parsePackageMethod = getMethod2(clsName, "parsePackage", paramClsArray)

注意:这里采用 paramClsArray(没有 * 展开) ,而不是 *paramClsArray

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/721996.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-26
下一篇2022-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存