android 反射调用隐藏方法,使用反射调用android API中的hide方法

在Android开发中,有些API方法被标记为隐藏。本文介绍如何通过反射调用隐藏的`getIntent()`方法。以`PendingIntent`为例,通过获取`PendingIntent`的`Class`对象,声明并设置`getIntent()`方法的访问权限,然后执行反射调用获取Intent对象。如果对反射感兴趣,可以参考提供的详细教程链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在进行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 {

Classcls = 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);

ArrayListmessages = (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.youkuaiyun.com/sinat_38259539/article/details/71799078

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值