本文主要是介绍使用反射调用android API中的hide方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在进行Android项目开发过程中,有很多公开的api方法可以直接调用,但是还有一部分api方法是hide的,如下所示:
android/app/PendingIntent.java:
/*** @hide* Return the Intent of this PendingIntent.*/
public Intent getIntent() {try {return ActivityManager.getService().getIntentForIntentSender(mTarget);} catch (RemoteException e) {throw e.rethrowFromSystemServer();}
}
我们是无法通过PendingIntent的实例来get这个方法的,这个时候就需要用到反射,直接上我的代码如下:
PendingIntent mPendingIntent = entry.contentIntent;
try {Class<PendingIntent> cls = PendingIntent.class;//首先还是必须得到这个对象的Class。Method mGetIntent = cls.getDeclaredMethod("getIntent");//得到执行的methodmGetIntent.setAccessible(true);//设置访问权限
//执行该Method.invoke方法的参数是执行这个方法的对象owner,和参数数组args,可以这么理解:owner
//对象中带有参数args的method方法。返回值是Object,也既是该方法的返回值;
//注:要调用的方法无参数,则invoke只传owner,不需要args数组,如下:Intent mIntent = (Intent) mGetIntent.invoke(mPendingIntent);ArrayList<IMMessage> messages = (ArrayList<IMMessage>) mIntent.getSerializableExtra(NimIntent.EXTRA_NOTIFY_CONTENT);IMMessage mMessage = messages.get(0);if(mMessage != null){return mMessage;}} catch (NoSuchMethodException e) {e.getStackTrace();} catch (IllegalAccessException e){e.getStackTrace();} catch (InvocationTargetException e){e.getStackTrace();}
注意:getIntent是没有参数的,所以invoke方法中只有一个参数:要调用的方法所在的类实例:ower
有关反射的更详细内容,有兴趣可以查看:
https://blog.csdn.net/sinat_38259539/article/details/71799078
这篇关于使用反射调用android API中的hide方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!