2012-12-07 4 views
5

"NO_CACHE"をnewValueに設定したいとします。ここに私のコードは次のとおりです。Java Reflectionを使用して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.oschina.net/code/explore/android-2.2-froyo/java/lang/reflect/Field.java

Javaで上記のコードが動作することができますが、それは上で動作しません:これはAndroidのFieldクラスコードである

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

Androidプラットフォーム

これを修正するにはどうすればよいですか?

+0

「CacheManager」とは何ですか? –

+0

android.webkit.CacheManager – user1884025

+0

これはAndroid以外のクラスであれば、Androidの外でどのように動作しますか? –

答えて

2

Androidは実際にはJDKのソースコードを使用していません。それは非常に似ていますが、同じではありません。

Javaでは、修飾子はjava.lang.reflection.Fieldですが、Androidではそのような型はありません。 Androidは、ネイティブメソッドを呼び出すことによって、整数とフィールドの名前を使用して修飾子を検証するシステムを実装しました。

私は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のフィールドは、 'modifiers 'ではなく' slot'ではなく 'accessFlags'と呼ばれます – for3st

関連する問題