使用反射调用android API中的hide方法
16lz
2021-01-23
在进行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 cls = PendingIntent.class;//首先还是必须得到这个对象的Class。 Method mGetIntent = cls.getDeclaredMethod("getIntent");//得到执行的method mGetIntent.setAccessible(true);//设置访问权限//执行该Method.invoke方法的参数是执行这个方法的对象owner,和参数数组args,可以这么理解:owner//对象中带有参数args的method方法。返回值是Object,也既是该方法的返回值;//注:要调用的方法无参数,则invoke只传owner,不需要args数组,如下: Intent mIntent = (Intent) mGetIntent.invoke(mPendingIntent); ArrayList messages = (ArrayList) 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 中使用自定义字体的方法
- 半透明Activity方法
- Android开发由eclipse转Android Studio中一些常见出错问题解决方
- android摄像头采集和预览-第二种方法
- 使用WebView中的JavaScript调用Android方法
- H5 Web网页通过JS(JavaScript)脚本调用Android本地原生方法函数
- Android 中不弹出软键盘的方法
- android 静音方法