2012-06-25 13 views
16

Change private static final field using Java reflectionアンドロイド:Javaのリフレクション

を使用してプライベート静的最終フィールドを変更し、私はJavaのリフレクションを使用してプライベート静的最終フィールドを変更するには、上記のリンクの指示に従いました。私は "データ"という名前のオブジェクトを持っています。 「データ」内には、「タイプ」という名前のプライベート静的最終変数があります。私は "タイプ"をnullに設定したい。 ここに私のコードです。

Field field = data.getClass().getDeclaredField("type"); 
field.setAccessible(true); 
Field modifiersField = Field.class.getDeclaredField("modifiers"); 
modifiersField.setAccessible(true); 
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 
field.set(data, null); 

これをJava 1.7でも同様のコードで試してみました。しかし、Android上でこのコードを実行すると、次のエラーを生成します。 java.lang.NoSuchFieldExceptionの:修飾子

私が推測する「修飾子は、」Android上Fieldクラスのフィールドではありません。

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

+0

あなたはクラスフィールド_ _runtime._ –

+1

で_modifiersを変更することはできません。そのリンクに従うことができます。 – jas7

+2

Javaコンパイラは、プリミティブな静的最終フィールドの値をインラインで設定できることに注意してください。このような反射魔法をすると、奇妙な行動につながる可能性があります。 – millimoose

答えて

10

これは機能します。

Field field = data.getClass().getDeclaredField("type"); 
field.setAccessible(true); 
field.set(data, null); 
+1

これは機能しました。しかし、なぜ? ARTは最終修飾語を削除しますか、とにかく簡単にアクセスできますか? –

+0

'field.set(...)'関数の最初のオブジェクトがフィールド – prom85

+0

のデータを修正するオブジェクトであるため、これは動作します。この場合、データは静的ではありませんか? –

関連する問題