关于反射传递参数


#1

我打算在 kotlin 代码里反射调用

private int postSyncBarrier(long when)

代码如下:

val postSyncBarrierMethod =
        MessageQueue::class.java.getDeclaredMethod("postSyncBarrier", Long::class.java)

但是运行后报错了:

Caused by: java.lang.NoSuchMethodException: android.os.MessageQueue.postSyncBarrier [long]
at java.lang.Class.getMethod(Class.java:2072)
at java.lang.Class.getDeclaredMethod(Class.java:2050)

我记得在 Java 代码里反射时,第二个参数应该写成 long.class,但是 kotlin 里面该怎么传递呢?


#2

Long::class.javaPrimitiveType


#3

试过了刚刚,还是会同样的错误。但是,在 Java 里面调用是好的。


#4

我也遇到了同样的问题:disappointed_relieved:


#5

我在java代码里反射调用这个方法也不行,有人说是高版本(26以上)禁止反射调用这个方法……
手头没有低版本机器可以验证。


#6

https://developer.android.google.cn/guide/app-compatibility/restrictions-non-sdk-interfaces#determine-list
这里有写哪些接口被限制了,你翻墙下下来搜一下就知道了,@hide注解的基本都有


#7

这个跟Kotlin没有关系。原因是Android P开始对部分@hide注解的成员增加了反射限制。也就是说就算使用Java,通过常规的反射方式也拿不到MessageQueue::postSyncBarrier这个方法。


京ICP备16022265号-2 Kotlin China 2017 - 2018