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

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 的类 KClassFile::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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值