繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM