Android源码相关编程测试的时候遇到问题,想用Java的反射机制调用Message
的方法recycleUnchecked()
(该方法不能直接在包外调用),使用如下语句:
Message.obtain().getClass().getDeclaredMethod("recycleUnchecked");
运行时异常为:NoSuchMethodException
查看Java的API文档:getDeclaredMethod
方法是能获取到当前类(父类继承的不算)中的所有方法,包括public,private,default
和protected
的
而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
方法呢?是因为它本身在类加载的时候就不在Message
的class
对象里面吗?如果没有,那么它又是怎样被访问的呢?
android.os.Message
类中只有recycle()
方法,没有你说的recycleUnchecked()
method, you can download the Android source code through SDK-Manager.