2010-01-11 19 views
14

Lo siento por hacer este tipo de preguntas, pero realmente no pude encontrar la respuesta en Google. Entonces digo que tengo una clase con private String myColor y tengo una cadena "myColor". Ahora quiero manipular el atributo myColor. ¿Cómo puedo hacer eso?En Java, ¿cómo obtener el atributo dado a la cadena con su nombre?

Edit: Lo siento por una pregunta poco clara, creo que la mejor manera es explicar para qué la necesito. Tengo un formulario Swing y quiero usar la API de preferencias para establecer los valores de los campos al cargar la GUI. Entonces puedo leer todos los campos y luego hacer outputDirectoryTextField.setText(valueFromPrefsAPI); para cada uno de ellos, pero eso parece ser un poco innecesario de codificación, así que quiero tener una matriz (¿hash?) Con los nombres de los campos y recorrerlos, así:

String[] myTextInputs = {"thisInput", "thatInput"}; 

for (String inputName : myTextInputs) { 
    String value = prefs.get(inputName, ""); 
    /* some code I'm seeking to find out*/.setText(value); 
} 
+1

Verifique el enlace desde la página de mi perfil, está hecho para este propósito. Usando mi utilidad, solo necesita hacer 'BeanPropertyController bpc = BeanPropertyController.of (YourClass.class, ExtractionDepth.FIELDS); bpc.mutate ("myColor", itsNewValue); 'Sin embargo, tenga en cuenta que' ExtractionDepth.FIELDS' supone que existe al menos un getter para el campo con un nombre coincidente. – Esko

Respuesta

36

Puede utilizar la reflexión para inspeccionar el contenido de cualquier objeto, de la siguiente manera:

Object o = ...; // The object you want to inspect 
Class<?> c = o.getClass(); 

Field f = c.getDeclaredField("myColor"); 
f.setAccessible(true); 

String valueOfMyColor = (String) f.get(o); 

Tenga en cuenta que getDeclaredField() solo devolverá el campo declarado por la clase del objeto. Si está buscando un campo que fue declarado por una superclase, debe recorrer todas las clases del objeto (haciendo repetidamente c = c.getSuperclass() hasta c == nulo)

Si desea cambiar la valor del campo se puede utilizar el método set:

f.set(o, "some-new-value-for-field-f-in-o") 

detalles adicionales: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Field.html


https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getField(java.lang.String)

usted puede usar getField (...) que buscará en superclase si no se encuentra en clase.

+1

Tendrás que lanzar explícitamente a 'String' en la última línea, ya que' Field' s no son genéricos y así get() devuelve un resultado de tipo 'Object'. También necesitaría atrapar varios tipos de excepciones de seguridad y tener en cuenta que, dependiendo del entorno, es posible que este código no se pueda ejecutar en absoluto. Es * lo que el OP solicitó, pero es solo responsable de hacerle saber estas cosas y dirigirlo hacia alternativas más apropiadas. –

1

Debe crear un "mutador" para modificar las variables de miembros privados.

class example{ 
    private string myColor; 
    public void changeColor(string newColor){ 
     myColor = newColor; 
    } 
} 
+0

Setters and Getters sería una forma mucho más común de hacer esto; ver el ejemplo del código de Mickel. –

+1

mutador es otro nombre para un colocador. http://en.wikipedia.org/wiki/Mutator_method > El método del mutador, a veces llamado "setter" ... – zmbush

3

Si entiendo bien su pregunta ... Debe crear captadores y definidores públicos:

public void setMyColor(String color) { 
    this.myColor = color; 
} 

public String getMyColor { 
    return this.myColor; 
} 
3

Basado en la edición, mi sugerencia es utilizar un Mapa para contener un mapa de nombre de preferencia para el campo de texto apropiado u otro componente de texto. Simplemente construya el mapa cuando construya la interfaz de usuario.

Map<String, JTextField> guiFields = new HashMap<String, JTextField>(); 

, entonces puede tener el código de hacer

guiFields.get(inputName).setText(value); 
+0

¿Vota por qué? ¿Mala idea? –

2

Depende en la que desea hacer esto. Dentro de la clase que simplemente lo que con él, por ejemplo:

myColor = "blah blah"; 

Desde el exterior, es necesario tener algún método público en general, como indican otros mensajes. En todos los casos, debe tener cuidado si su entorno tiene múltiples subprocesos. Las variables de nivel de clase no son seguras para subprocesos.

Cuestiones relacionadas