2010-01-11 8 views
14

Mi dispiace per questo tipo di domande, ma non ho trovato la risposta in Google. Quindi dire che ho una classe con private String myColor e ho una stringa "myColor". Ora voglio manipolare l'attributo myColor. Come lo posso fare?In Java, come ottenere l'attributo data la stringa con il suo nome?

Modifica: Ci scusiamo per una domanda poco chiara, immagino che il modo migliore sia quello di spiegare per cosa ho bisogno. Ho un modulo Swing e voglio usare le preferenze api per impostare i valori dei campi durante il caricamento di gui. Quindi posso leggere tutti i campi e quindi fare outputDirectoryTextField.setText(valueFromPrefsAPI); per ognuno di essi, ma sembra essere un po 'di codifica non necessaria, quindi voglio avere un array (hash?) Con i nomi dei campi e scorrere in loop, in questo modo:

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

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

Controllare il collegamento dalla mia pagina del profilo, è fatto per questo scopo. Usando la mia utility hai solo bisogno di fare 'BeanPropertyController bpc = BeanPropertyController.of (YourClass.class, ExtractionDepth.FIELDS); bpc.mutate ("myColor", itsNewValue); 'Tuttavia si noti che' ExtractionDepth.FIELDS' presuppone che esista almeno un getter per il campo con un nome corrispondente. – Esko

risposta

36

È possibile utilizzare la reflection per ispezionare il contenuto di qualsiasi oggetto, come segue:

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

Nota che getDeclaredField() restituirà solo i campi dichiarati dalla classe dell'oggetto. Se stai cercando un campo dichiarato da una superclasse dovresti eseguire il loop su tutte le classi dell'oggetto (ripetendo c = c.getSuperclass() fino a c == null)

Se vuoi cambiare il valore del campo è possibile utilizzare il metodo set:

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

Osservazioni: 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)

È può usare getField (...) che cercherà sulla super classe se non si trova in classe.

+1

Dovresti eseguire il cast esplicito su 'String' nell'ultima riga, poiché' Field' s non sono generici e quindi get() restituisce un risultato di tipo 'Object'. Dovresti inoltre rilevare vari tipi di eccezioni di sicurezza e tenere presente che, a seconda dell'ambiente, questo codice potrebbe non essere in grado di funzionare affatto. È * quello che l'OP ha chiesto, ma è solo responsabile di fargli sapere queste cose e guidarlo verso alternative più appropriate. –

1

È necessario creare un "mutatore" per modificare le variabili dei membri privati.

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

Setter e Getter sarebbero un modo molto più comune per farlo; vedi l'esempio di codice di Mickel. Il modificatore –

+1

è un altro nome per un setter. http://en.wikipedia.org/wiki/Mutator_method > Il metodo del mutatore, a volte chiamato "setter" ... – zmbush

3

Se ho capito bene la tua domanda ... Si dovrebbe creare getter e setter pubblici:

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

public String getMyColor { 
    return this.myColor; 
} 
3

In base alla modifica, il mio suggerimento è di utilizzare una mappa per contenere una mappa del nome di preferenza per il campo di testo appropriato o un altro componente di testo. Crea semplicemente la mappa quando crei l'interfaccia utente.

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

allora si può avere il codice di fare

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

Downvote perché? Cattiva idea? –

2

Dipende da dove si vuole fare questo. All'interno della classe è sufficiente tutto ciò con esso, per esempio:

myColor = "blah blah"; 

Da fuori, è necessario avere un po 'di metodo pubblico in generale come altri posti indicati. In tutti i casi, devi stare attento se il tuo ambiente è multi-thread. Le variabili di livello di classe non sono thread-safe.

Problemi correlati