[英]Using reflection for setting new value for private member
我正在创建一些android应用只是为了好玩(它并不是真正的应用,就像沙盒一样)。
我第一次使用反射在Android SDK类的对象的私有字段中设置一些新值。
看起来像这样:
try {
f = obj.getClass().getDeclaredField("<field_name>");
f.setAccessible(true);
f.set(obj, <new_value>);
} catch (Exception e) {
// log
}
我知道使用它是一种不好的做法(我会尽快对其进行更改),但是现在是这种方式。 它在我的3个设备和仿真器上都能正常工作。
所以我的问题是:在哪些情况下,我不能为现有字段设置新值?
我后面跟随Android的源代码,并转到此文件: AccessCheck.c 。
dvmCheckFieldAccess
方法负责引发IlligalAccessExceptin。 这就是我的要求。 如果方法返回false
则将抛出IlligalAccessExceptin。
我认为这种情况的主要原因是:
if (accessFlags & ACC_PRIVATE)
return false;
如果所有Android设备都使用原始DVM(Dalvik VM),则ACC_PRIVATE
标志必须相同。因此,它告诉我们@executifs建议的相同内容。 如果我错了纠正我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.