2012-12-07 84 views
5

我想將「NO_CACHE」設置爲newValue。這裏是我的代碼:使用Java反射的Android更改私有靜態最終字段?

static void setFinalStatic(Object newValue) throws Exception 
{ 
    Field field = CacheManager.class.getDeclaredField("NO_CACHE"); 
    field.setAccessible(true); 
    Field modifiersField=Field.class.getDeclaredField("modifiers"); 
    modifiersField.setAccessible(true); 
    modifiersField.setInt(field,field.getModifiers() & ~Modifier.FINAL); 
    field.set(null, newValue); 
} 

但運行在Android這個代碼產生以下錯誤:

java.lang.NoSuchFieldException: modifiers 

我發現modifiers是在Java中的Field類中的字段,但它不是在一個領域Android上的Field類。

這就是Java Field類代碼:

http://www.docjar.com/html/api/java/lang/reflect/Field.java.html

這是Android的Field類代碼:

http://www.oschina.net/code/explore/android-2.2-froyo/java/lang/reflect/Field.java

Java中的上面的代碼可以工作,但它不工作的Android平臺。

我該如何解決這個問題?

+0

什麼是'CacheManager'? –

+0

android.webkit.CacheManager – user1884025

+0

如果它是Android專用的類,它將如何在Android之外工作? –

回答

2

Android實際上並未使用JDK源代碼。它非常相似,但不一樣。

在Java中,修飾符類型爲java.lang.reflection.Field,但在Android中不存在此類型。 Android通過調用本地方法實現了一個使用整數和Field名稱來驗證其修飾符的系統。

我認爲private static final場將有slot -1,如果你想改變一個private static final場,設置值之前只是改變slot 3私有字段將具有值3。

Field booleanField = Boolean.class.getField("FALSE"); 
booleanField.setAccessible(true); 

Field slotField = Field.class.getDeclaredField("slot"); 
slotField.setAccessible(true); 
slotField.set(booleanField, 3); 

booleanField.set(Boolean.FALSE, true); 
+1

Android中的字段被稱爲'accessFlags'不是'slot'而不是'modifiers' – for3st

相關問題