Decir que tengo una clase:

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

¿Cómo puedo obtener el valor de la «_1ª» a través de la reflexión?

  • R._1st no podía trabajar? Si usted está hablando sobre el desarrollo de Android, creo que el R clase siempre está ahí…
  • Yo también lo creía, hasta este día cuando tuve que hacer la misma cosa, pero sólo con la BR clase.
InformationsquelleAutor Viet | 2010-04-21

3 Comentarios

  1. 118

    Primer recuperar la propiedad de campo de la clase, entonces usted puede recuperar el valor. Si usted sabe el tipo que usted puede utilizar uno de los métodos get con null (para campos estáticos sólo, de hecho, con un campo estático el argumento pasado al método get es ignorada completamente). De lo contrario, puede utilizar getType y escribir un modificador 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));
    }...
    • gracias. Intenté pero no funcionó. La excepción se produce en la operación de f.getInt(null). Lo cogí pero, ¿por qué hay una excepción?
    • Qué tipo de excepción recibiste?
    • Hola, con la Excepción de el correo.getMessage() devuelve el nombre del campo, que es «_1ª» y nada más.
    • Pero ¿cuál es el tipo de la excepción? (es decir, NullPointerException, SecurityException, …)
    • Ya lo he conseguido. La clase que yo necesitaba era realmente R. id. Gracias por su ayuda!
    • Cómo es que la documentación no menciona que getInt() ignora el pasado en el argumento? Pasé horas tratando de obtener la instancia de la clase para pasar por ahí.

  2. 61
     R.class.getField("_1st").get(null);

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

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

    Esto funciona para todos los campos estáticos, independientemente de su final. Si el campo no es pública, debe llamar a setAccessible(true) en primer lugar, y por supuesto el SecurityManager tiene que permitir todo esto.

    • ¿puede aclarar lo que no funcionó al respecto? Tal vez publique el código que tienes que no está funcionando?
    • Hola, con la Excepción de el correo.getMessage() devuelve el nombre del campo, que es «_1ª» y nada más.
    • Hola Viet, ¿qué acerca de la traza de la pila, y ¿cuál es el tipo de la excepción?
    • Ya lo he conseguido. La clase que yo necesitaba era realmente R. id. Gracias por su ayuda!
  3. 1

    Yo estaba siguiendo la misma ruta (mirando a través de la generada clase R) y, a continuación, tuve esa horrible sensación de que era probablemente una función de los Recursos de la clase. Yo estaba en lo correcto.

    Encontrado esto:
    Recursos::getIdentifier

    Pensado que podría salvar a la gente algún tiempo. Aunque dicen que no se aconseja en los docs, que no es demasiado sorprendente.

    • Así se infiere era un Androide pregunta. Debería haber sido indicado en las etiquetas…
    • No es un Androide pregunta, es una reflexión Java pregunta que utiliza un ejemplo en particular. Las preguntas son de etiquetado basado en su tema.

Dejar respuesta

Please enter your comment!
Please enter your name here