我正在创建一些Android应用程序只是为了好玩(它不是真正的应用程序,就像沙盒一样)。
我第一次使用反射在Android SDK类的对象的私有字段中设置一些新值。
看起来像这样:
try {
f = obj.getClass().getDeclaredField("<field_name>");
f.setAccessible(true);
f.set(obj, <new_value>);
} catch (Exception e) {
// log
}
我知道使用它是一种不好的做法(我会尽快改变它),但现在就是这样。 它在我的3台设备和模拟器上运行良好。
所以我的问题是:在哪些情况下我无法为现有字段设置新值?
答案 0 :(得分:0)
我跟着Android的sorce代码并来到这个文件: AccessCheck.c
dvmCheckFieldAccess
方法负责抛出IlligalAccessExceptin。这就是我的要求。如果方法返回false
,将抛出IlligalAccessExceptin。
我认为这个案例的主要内容是:
if (accessFlags & ACC_PRIVATE)
return false;
如果所有Android设备使用原始DVM(Dalvik VM), ACC_PRIVATE
标志必须相同,因此它告诉我们同样的建议@executifs。如果我错了,请纠正我。