重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Android 11 apk开发过程中。使用 反射机制 调用方法失败,总是报错(blocked, reflection, denied),被拒绝,下面是解决方法
且末ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
步骤一:In your root build.gradle:
步骤二:In your library/build.gradle add:
-什么是反射机制?
反射机制是在运行状态中,对于任意一个类(Class),都能够知道这个类的所有属性和方法(Method);对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
-反射机制能做什么?
主要功能:调用隐藏API,即标注了 @hide 的方法。
其他:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
-注意事项?
Google之所以要将一些API隐藏(指加上@hide标记的public类、方法或常量)是有原因的。其中很大的原因就是Android系统本身还在不断的进化发展中。从1.0、1.1到现在即将问世的Android 2.3.4。 这些隐藏的API本身可能是不稳定的,所以,使用隐藏API,意味着程序更差的兼容性。
如果要我给出建议的话,最好还是不要使用隐藏的API。不过有时为了实现Android应用某些特殊的功能或者效果,隐藏的API往往能发挥意想不到的作用。这些API具体能做些什么事,我就不在这里举例了。正好,如果你不知道隐藏API能做什么的话,那么还是尽早放弃使用它们吧……
引用内容自:
baike.xsoftlab.net/view/209.html
blog.sina.com.cn/s/blog_5da93c8f0101e1yj.html
Dealing with Java Reflection API is painful. Ask anyone you know that uses reflection and he will tell you it's really unpleasant getting yourself around it.
Take a look at the following code:
//Let's just set a field value. Should be a simple task, right?
//"target" is the object containing the field whose value you want to set.
Field toSet = null;
for (Field f : target.getClass().getDeclaredFields()) {
//Get all fields DECLARED inside the target object class
if (f.getName().equals("field")) {
toSet = f;
}
}
if (toSet != null (toSet.getModifiers() Modifier.STATIC) == 0) {
toSet.setAccessible(true);
toSet.set(target, value);
}
int layout=activity.getResources().getIdentifier("layout_hint_dialog","layout",activity.getPackageName());
int close_btn1=activity.getResources().getIdentifier("close_btn","id",activity.getPackageName());
Android 9开始,系统会阻止开发者调用非SDKAPI,比如ActivityThread.currentActivityThread(),那有没有办法绕过这些限制呢?
首先说一下Google限制调用的原理:
就一句话:如果不是系统类,且API处于黑名单,禁止调用。
依据上述原理,可以破坏第一个条件,即通过系统类的身份去调用隐藏API。
请看如下工具类,我们通过反射去获取Class.class类上getDeclaredMethod方法,获取到的Method可以称为
“元反射方法”,通过“元反射方法” 去调用隐藏API,就意味着调用者是java.lang.Class,这个类属于系统类,可以正常调用!!!
下面本人写的工具类在Android 10上亲测有效,拿走不谢,哈哈!
如果对你有帮助,顺手点个赞哦!