В 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;
    }
}