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