Java получает значение свойства по имени свойства

Возможно ли в Java получить значение свойства класса по его имени? например, у меня есть класс вроде

public class Test {
    private String field;
    public String getField() {...}
    public void setField() {...}
}

и еще один класс с Map

public class Main {
    private static final Map<String, Long> map = new HashMap<String, Long>();
    static {
        map.put("field", new Long(1));
    }
    public void doSth() {
    Set<String> keys = map.keySet();
    Test t = new Test();
    for (String key : keys) {
    //t.getPropertyValueByName(key); ?
    }
    }

Ответ 1

Вы можете использовать некоторые библиотеки, предлагающие доступ на основе свойств. Я думаю, что самый известный и используемый beanutils. Вы можете найти один хороший пример beanutils "в действии" здесь. Пример кода:

A someBean = new A();

// access properties as Map
Map<String, Object> properties = BeanUtils.describe(someBean);
properties.set("name","Fred");
BeanUtils.populate(someBean, properties);

// access individual properties
String oldname = BeanUtils.getProperty(someBean,"name");
BeanUtils.setProperty(someBean,"name","Barny"); 

Ответ 2

Да. Вы можете заменить пропущенную строку на t.getClass(). GetField (map.get(key)). Get (t). который будет извлекать значение поля по t.

Ответ 3

bjc2406 ответ работает нормально, пока поле (области), о котором идет речь, доступно:

t.getClass(). ПолучитьПолеЗаголовка (map.get(ключ)). Получим (т)

Если вы не можете разумно сделать это общедоступным, рефлексия и другие API доступа к полю должны выполнить свою работу: Как мне прочитать приватное поле в Java?

Ответ 4

Вопрос в том, как часто изменяются свойства? Являются ли константы, или это будет зависеть от ситуации?

Если это последний случай, который часто бывает, вы хотите, чтобы свойства находились во внешнем файле. Стандартные java-свойства api отлично подходят для этого: http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html.

Если вы используете фреймворк вроде spring, он также будет иметь стандартные способы работы со свойствами. Посмотрите в их документации.

Ответ 5

Помимо
String org.apache.commons.beanutils.BeanUtils.getProperty(object, propertyName)

Object org.apache.commons.beanutils.PropertyUtils#getProperty(object, propertyName)
не превращает значение в строку.

Это может быть полезно для сохранения целочисленных, десятичных и логических типов.