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)
не превращает значение в строку.
Это может быть полезно для сохранения целочисленных, десятичных и логических типов.
Ответ 6
Вы также можете перейти к классу Properties.java: http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html
Он выполняет ту же работу.