検索

ホームページ  >  に質問  >  本文

Java反射问题:为什么android.os.Message的recycleUnchecked方法不能通过反射获取到?

Android源码相关编程测试的时候遇到问题,想用Java的反射机制调用Message的方法recycleUnchecked()(该方法不能直接在包外调用),使用如下语句:

Message.obtain().getClass().getDeclaredMethod("recycleUnchecked");

运行时异常为:NoSuchMethodException

查看Java的API文档:getDeclaredMethod方法是能获取到当前类(父类继承的不算)中的所有方法,包括public,private,defaultprotected

而recycleUnchecked方法在android.os.Message中的定义如下:

void recycleUnchecked(){...}

所以正常情况我的代码应该能够正常访问到相应方法的。

接着为了深入了解异常出现的原因,我用下面的代码列出了Message中的所有方法:

        int i = 0;
        Method[] methods = Message.obtain().getClass().getDeclaredMethods();
        for(Method method : methods){
            i++;
            Log.i("JiahongZhou", i + "---" + method.getName() + method.getParameterTypes().toString());
        }

输出结果如下:

JiahongZhou: 1---clearForRecycle[Ljava.lang.Class;@426d15d0
JiahongZhou: 2---copyFrom[Ljava.lang.Class;@426dd788
JiahongZhou: 3---describeContents[Ljava.lang.Class;@426e76d8
JiahongZhou: 4---getCallback[Ljava.lang.Class;@426edbf0
JiahongZhou: 5---getData[Ljava.lang.Class;@426eb8f8
JiahongZhou: 6---getTarget[Ljava.lang.Class;@426ee8d8
JiahongZhou: 7---getWhen[Ljava.lang.Class;@426f8f18
JiahongZhou: 8---isAsynchronous[Ljava.lang.Class;@4271df20
JiahongZhou: 9---isInUse[Ljava.lang.Class;@4272c078
JiahongZhou: 10---markInUse[Ljava.lang.Class;@42761010
JiahongZhou: 11---peekData[Ljava.lang.Class;@427e04d8
JiahongZhou: 12---recycle[Ljava.lang.Class;@427e13e8
JiahongZhou: 13---sendToTarget[Ljava.lang.Class;@4280ee48
JiahongZhou: 14---setAsynchronous[Ljava.lang.Class;@42830f68
JiahongZhou: 15---setData[Ljava.lang.Class;@4285ab70
JiahongZhou: 16---setTarget[Ljava.lang.Class;@428904d0
JiahongZhou: 17---toString[Ljava.lang.Class;@42891d78
JiahongZhou: 18---toString[Ljava.lang.Class;@428a5248
JiahongZhou: 19---writeToParcel[Ljava.lang.Class;@428ab450
JiahongZhou: 20---access$000[Ljava.lang.Class;@428b8e88
JiahongZhou: 21---obtain[Ljava.lang.Class;@428c6458
JiahongZhou: 22---obtain[Ljava.lang.Class;@428da478
JiahongZhou: 23---obtain[Ljava.lang.Class;@428e6288
JiahongZhou: 24---obtain[Ljava.lang.Class;@428ff468
JiahongZhou: 25---obtain[Ljava.lang.Class;@42915900
JiahongZhou: 26---obtain[Ljava.lang.Class;@42915a08
JiahongZhou: 27---obtain[Ljava.lang.Class;@42964730
JiahongZhou: 28---obtain[Ljava.lang.Class;@425ef398
JiahongZhou: 29---readFromParcel[Ljava.lang.Class;@425f50d0

可以看到在上面的输出中看不见recycleUnchecked方法,然而和它定义相似(参数类型,访问权限限定符以及返回值均相同)的方法markInUse却能输出。

MarkInUse定义如下:

void markInUse(){...}

请问:Java的反射机制是否对某些特殊的方法做了不能被反射获取的限制?为什么这里我获取不到recycleUnchecked方法呢?是因为它本身在类加载的时候就不在Messageclass对象里面吗?如果没有,那么它又是怎样被访问的呢?

PHP中文网PHP中文网2807日前630

全員に返信(1)返信します

  • ringa_lee

    ringa_lee2017-04-18 10:53:29

    android.os.Message 类中只有 recycle() 方法,没有你说的 recycleUnchecked() の方法では、SDK-Manager を通じて Android ソース コードをダウンロードできます。

    返事
    0
  • キャンセル返事