簡體   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