2010-04-21 23 views
68

Decir que tengo una clase:Obtener valor de campo/propiedad public static final de una clase en Java a través de la reflexión

public class R { 
    public static final int _1st = 0x334455; 
} 

¿Cómo puedo obtener el valor del campo/propiedad "_1st" a través de la reflexión?

+0

'R._1st' no funcionó? Si estás hablando del desarrollo de Android, creo que la clase 'R' siempre está ahí ... – Matthieu

+0

@Matthieu Lo pensé también, hasta este día en que tuve que hacer lo mismo, pero solo con el' BR' clase. – Sevastyan

Respuesta

94

Primero recupera la propiedad del campo de la clase, luego puedes recuperar el valor. Si conoce el tipo, puede usar uno de los métodos get con null (para campos estáticos solamente, de hecho con un campo estático, el argumento pasado al método get se ignora por completo). De lo contrario puede utilizar getType y escribir un interruptor apropiado de la siguiente manera:

Field f = R.class.getField("_1st"); 
Class<?> t = f.getType(); 
if(t == int.class){ 
    System.out.println(f.getInt(null)); 
}else if(t == double.class){ 
    System.out.println(f.getDouble(null)); 
}... 
+0

gracias. Lo intenté pero no funcionó. Se produce una excepción en la operación f.getInt (null). Lo atrapé, pero ¿cómo es que hay una excepción? – Viet

+1

¿Qué tipo de excepción recibió? –

+0

Hola, la excepción e.getMessage() devuelve el nombre del campo, que es "_1st" y nada más. – Viet

42
R.class.getField("_1st").get(null); 

El manejo de excepciones se deja como un ejercicio para el lector.

Básicamente se obtiene el campo como cualquier otro a través de la reflexión, pero cuando se llama al método get pasa un nulo ya que no hay ninguna instancia para actuar.

Esto funciona para todos los campos estáticos, independientemente de que sean definitivos. Si el campo no es público, primero debe llamar al setAccessible(true) y, por supuesto, SecurityManager debe permitir todo esto.

+0

gracias pero no ayudó ... – Viet

+2

@Viet, ¿puedes aclarar qué no funcionó? Tal vez publicar el código que tiene que no está funcionando? – Yishai

+0

Hola, la excepción e.getMessage() devuelve el nombre del campo, que es "_1st" y nada más. – Viet

1

estaba siguiendo la misma ruta (mirando a través de la clase I generados) y luego tuve esta terrible sensación de que era probablemente una función en la clase Recursos . Yo tenía razón.

encontré esto: Resources::getIdentifier

pensó que podría salvar a la gente algún tiempo. Aunque dicen que es desalentada en los documentos, lo cual no es demasiado sorprendente.

+0

Perfecto para leer recursos de otros apk – schwiz

+0

Así que dedujo que era una pregunta de Android. Debería haber sido indicado en las etiquetas ... – Matthieu

+0

No es una pregunta de Android, es una pregunta de reflexión de Java que usa un ejemplo particular. Las preguntas se etiquetan según su tema. –

Cuestiones relacionadas