2012-12-07 13 views
5

मैं नया वैल्यू होने के लिए "NO_CACHE" सेट करना चाहता हूं।जावा प्रतिबिंब का उपयोग कर एंड्रॉइड निजी स्थिर अंतिम क्षेत्र बदल रहा है?

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); 
} 

लेकिन एंड्रॉयड पर इस कोड चल निम्न त्रुटि पैदा करता है: यहाँ मेरी कोड है

java.lang.NoSuchFieldException: modifiers 

मैं modifiers खोजने के जावा में Field कक्षा में एक क्षेत्र है, लेकिन यह एक क्षेत्र नहीं है एंड्रॉइड पर Field कक्षा।

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

यह Field वर्ग कोड एंड्रॉयड है:

यह जावा Field वर्ग कोड है

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

जावा में उपरोक्त कोड काम कर सकते हैं, लेकिन उस पर काम नहीं करता है एंड्रॉइड मंच।

मैं इसे कैसे ठीक करूं?

+0

'कैशमेनगर' क्या है? –

+0

android.webkit.CacheManager – user1884025

+0

यह एंड्रॉइड के बाहर कैसे काम करेगा, अगर यह एक एंड्रॉइड-केवल क्लास है? –

उत्तर

2

एंड्रॉइड वास्तव में जेडीके स्रोत कोड का उपयोग नहीं करता है। यह कुछ बहुत समान है लेकिन वही नहीं है।

जावा में, संशोधक java.lang.reflection.Field टाइप करते हैं, लेकिन एंड्रॉइड में ऐसा कोई प्रकार नहीं है। एंड्रॉइड ने एक ऐसी प्रणाली लागू की जो एक मूल विधि को कॉल करके, इसके संशोधक को सत्यापित करने के लिए एक पूर्णांक और फ़ील्ड का नाम उपयोग करता है।

मुझे लगता है कि एक private static final क्षेत्र slot होगा -1 और आप एक private static final क्षेत्र बदलने के लिए, बस मान सेट से पहले 3 करने के लिए slot बदल चाहते हैं एक निजी क्षेत्र मूल्य 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

एंड्रॉइड में फ़ील्ड को 'एक्सेसफ्लैग' कहा जाता है जिसे 'स्लॉट' नहीं' और 'संशोधक' नहीं कहा जाता है। – for3st

संबंधित मुद्दे