В Java, как получить атрибут, заданный строкой с ее именем?
Прошу прощения за такие вопросы, но я действительно не мог найти ответ в Google. Так сказать, у меня есть класс с private String myColor
, и у меня есть строка myColor. Теперь я хочу манипулировать атрибутом myColor
. Как я могу это сделать?
Edit:
Извините за непонятный вопрос, я думаю, лучший способ - объяснить, для чего он мне нужен. У меня есть форма Swing и вы хотите использовать настройки api для установки значений полей при загрузке gui. Поэтому я могу прочитать все поля, а затем сделать outputDirectoryTextField.setText(valueFromPrefsAPI);
для каждого из них, но это кажется немного ненужным кодированием, поэтому я хочу иметь массив (hash?) С именами полей и прокручивать их, например это:
String[] myTextInputs = {"thisInput", "thatInput"};
for (String inputName : myTextInputs) {
String value = prefs.get(inputName, "");
/* some code I'm seeking to find out*/.setText(value);
}
Ответы
Ответ 1
Вы можете использовать отражение для проверки содержимого любого объекта, как показано ниже:
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);
Обратите внимание, что getDeclaredField() будет возвращать только поле, объявленное классом объекта. Если вы ищете поле, которое было объявлено суперклассом, вы должны перебрать все классы объекта (повторяя c = c.getSuperclass() до c == null)
Если вы хотите изменить значение поля, вы можете использовать метод set:
f.set(o, "some-new-value-for-field-f-in-o")
Дополнительная информация: 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)
Вы можете использовать getField (...), который будет искать суперкласс, если он не найден в классе.
Ответ 2
Если я правильно понял ваш вопрос... Вы должны создать публичные геттеры и сеттеры:
public void setMyColor(String color) {
this.myColor = color;
}
public String getMyColor {
return this.myColor;
}
Ответ 3
На основе редактирования мое предложение состоит в том, чтобы использовать карту, чтобы содержать карту имени предпочтения в соответствующем текстовом поле или другом текстовом компоненте. Просто создайте карту при создании пользовательского интерфейса.
Map<String, JTextField> guiFields = new HashMap<String, JTextField>();
Затем вы можете сделать код
guiFields.get(inputName).setText(value);
Ответ 4
Это зависит от того, где вы хотите это сделать. Внутри класса вы просто все с ним, например:
myColor = "blah blah";
Извне, вам нужно иметь какой-то общедоступный метод, как указано в других сообщениях. Во всех случаях вы должны быть осторожны, если ваша среда многопоточна. Переменные уровня класса не являются потокобезопасными.
Ответ 5
Вы должны создать "мутатор" для изменения переменных частного члена.
class example{
private string myColor;
public void changeColor(string newColor){
myColor = newColor;
}
}