Доступ к переменной объекта объекта Java с именем строки

Я пытался выяснить, есть ли аналогичный способ в java, поскольку в javascript есть переменная-член, использующая строку, а не с явным обозначением точки.

Например, в javascript я могу получить доступ к переменной-члену элементов:

someObj["memVarName"] and someObj.memVarName

Итак, есть ли какой-либо способ, без необходимости писать конкретный метод для этого?

4 ответа

Синтетически - нет. Java, не так легко набирается, как JavaScript, и у разработчика нет такой же свободы, что и на объектных полях в первом, как он обычно делал бы в последнем.

Вы могли бы, однако, войти в глубины Reflection API и - зная имя получателя/сеттера, представляющего особый интерес, - вы могли бы заглянуть сюда. Как определить динамический сеттер и геттер с использованием отражения? , но, как вы, наверное, заметите на первый взгляд - это не стоит хлопот.


Что-то вроде

someObj.getClass().getField("memVarName").get(someObj)

Однако, как правило, на Java, когда вы соблазняетесь использовать отражение, проблема, которую вы пытаетесь решить, вероятно, лучше решается с помощью карты или интерфейсов.


Вы можете использовать BeanUtils (проект Apache), хотя и не такой аккуратный, как язык, как JavaScript, это менее болезненно, чем использование Reflection API.

Библиотека Googles Guava также предлагает обертку вокруг API Reflections, чтобы разрешить такой "именованный доступ",

В противном случае вы застряли с API-интерфейсом Reflection и Bean в основной Java.


Объект hashtable допускает аналогичную функцию.

В этом примере создается хэш-таблица чисел. Он использует имена чисел в качестве ключей:

Hashtable<string, integer=""> numbers
 = new Hashtable<string, integer="">();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);
</string,></string,>

Чтобы получить номер, используйте следующий код:

Integer n = numbers.get("two");
if (n != null) {
 System.out.println("two = " + n);
 }

Взято из http://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html

licensed under cc by-sa 3.0 with attribution.