2012-06-25 30 views
16

Change private static final field using Java reflectionAndroid: cambiar definitiva campo utilizando Java reflexión estática privada

He seguido las instrucciones en el enlace anterior para cambiar un campo private static final utilizando Java reflexión. Tengo un objeto llamado "datos". Dentro de "datos", hay una variable final privada estática llamada "tipo". Quiero configurar "tipo" para que sea nulo. Aquí está mi código.

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

He intentado hacer esto en Java 1.7 con un código similar y funcionó. Sin embargo, la ejecución de este código en Android produce el siguiente error: java.lang.NoSuchFieldException: modificadores

supongo "modificadores" no es un campo en la clase Field en Android.

¿Cómo puedo solucionar esto?

+0

Usted ... no puede cambiar los _modifiers en una clase field_ en _runtime._ –

+1

puedo según ese enlace. – jas7

+2

Recuerde que el compilador de Java puede alinear los valores de los campos finales estáticos primitivos. Hacer este tipo de magia de reflexión podría conducir a un comportamiento extraño. – millimoose

Respuesta

10

Esto funciona.

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

Esto funcionó. ¿Pero por qué? ¿ART elimina el modificador final o simplemente permite acceder a él de todos modos? –

+0

Esto funciona, porque el primer objeto en la función 'field.set (...)' es el objeto para modificar NO el campo – prom85

+0

datos no son estáticos en este caso? –

Cuestiones relacionadas