使用反射为私有成员设置新值

时间:2014-05-19 08:00:55

标签: java android

我正在创建一些Android应用程序只是为了好玩(它不是真正的应用程序,就像沙盒一样)。

我第一次使用反射在Android SDK类的对象的私有字段中设置一些新值。

看起来像这样:

try {
    f = obj.getClass().getDeclaredField("<field_name>");
    f.setAccessible(true);
    f.set(obj, <new_value>);
} catch (Exception e) {
    // log
}

我知道使用它是一种不好的做法(我会尽快改变它),但现在就是这样。 它在我的3台设备和模拟器上运行良好。

所以我的问题是:在哪些情况下我无法为现有字段设置新值?

1 个答案:

答案 0 :(得分:0)

我跟着Android的sorce代码并来到这个文件: AccessCheck.c

dvmCheckFieldAccess方法负责抛出IlligalAccessExceptin。这就是我的要求。如果方法返回false,将抛出IlligalAccessExceptin。

我认为这个案例的主要内容是:

if (accessFlags & ACC_PRIVATE)
    return false;
如果所有Android设备使用原始DVM(Dalvik VM),

ACC_PRIVATE标志必须相同,因此它告诉我们同样的建议@executifs。如果我错了,请纠正我。