Какая библиотека Java позволяет мне инициализировать свойства объекта из файла свойств? - PullRequest
3 голосов
/ 21 мая 2010

Существует ли библиотека Java, которая позволяет "десериализовать" файл свойств непосредственно в экземпляр объекта?

Пример: скажем, у вас есть файл с именем init.properties:

username=fisk
password=frosk

и класс Java с некоторыми свойствами:

class Connection {

    private String username;
    private String password;

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

Я хочу сделать это:

Connection c = MagicConfigurator.configure("init.properties", new Connection())

и MagicConfigurator применяет все значения из файла свойств к экземпляру Connection.

Есть ли библиотека с таким классом?

Ответы [ 8 ]

8 голосов
/ 21 мая 2010

Это довольно просто, используя commons-beanutils . Библиотека даже заботится о преобразованиях типов. Кроме того, вы можете даже установить свойства вложенных объектов и массивов.

public static void setProperties(Object bean, Properties properties) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
  for (Map.Entry<Object, Object> e : properties.entrySet()) {
    if (e.getKey() instanceof String) {
      BeanUtils.setProperty(bean, (String) e.getKey(), e.getValue());
    }
  }
}

Например, вы можете использовать файл свойств, подобный этому:

username=john
keys[0]=47
keys[1]=11
person.name=John
person.age=42

Ключи и возраст конвертируются в числа на лету. Массив ключей должен быть создан заранее, хотя и для Person.

1 голос
/ 21 мая 2010

Я бы использовал Настройки для этого

1 голос
/ 21 мая 2010

Это довольно просто сделать с помощью класса самоанализа BeanInfo.

Например, в основе этого будет нечто подобное.

public void readProperties(Object o, Properties p) throws IntrospectionException, InvocationTargetException, IllegalAccessException
{
    BeanInfo beanInfo = Introspector.getBeanInfo(o.getClass());
    for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors())
    {
        String value = p.getProperty(propertyDescriptor.getName());
        if ( value != null && propertyDescriptor.getWriteMethod() != null )
        {
            propertyDescriptor.getWriteMethod().invoke(o, value);
        }
    }
}
1 голос
/ 21 мая 2010

Библиотека? Это всего лишь несколько строк кода:

Для каждого ключа:

  1. Преобразование имени ключа в имя метода установки (основные строковые операции)
  2. Получить объект Method из объекта класса конфигурации (API отражения)
  3. Вызывает установщик объекта конфигурации со значением в качестве аргумента (API вызова)

Вы даже можете добавить это в класс конфигурации и реализовать конструктор, который читает объект Properties.

0 голосов
/ 21 мая 2010

Если вы используете xml вместо свойств, вы можете использовать JaxB.

0 голосов
/ 21 мая 2010

Я бы сказал, просто сделайте это сами (как предложил Andreas_D), это действительно просто, единственная «трудная» часть - это преобразование типов.

Но если вы действительно хотите сделать это с помощью библиотеки, вам может пригодиться мощный синтаксис выражений в OGNL.

http://www.opensymphony.com/ognl/

  1. Загрузить файл свойств в объект свойств
  2. Создайте экземпляр интересующего вас объекта.
  3. Поместите этот предмет в стек OGNL.
  4. Для каждого свойства используйте стек OGNL для установки значения. (что-то вроде stack.setValue( "property", value );)

Дополнительным бонусом является то, что вы также можете получить доступ к свойствам компонентных объектов, используя полный синтаксис OGNL. Вы можете сделать что-то вроде stack.setValue( "property.name", value );, где есть getProperty(), который возвращает, и объект с помощью метода get/setName().

0 голосов
/ 21 мая 2010

Только частичный ответ: ищите Свойства для первой части. Есть способ загрузки / хранения.

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

0 голосов
/ 21 мая 2010

Я хотел бы взглянуть на конфигурацию общего ресурса и посмотреть, существует ли в нем эквивалент общинного дигестора , использующего его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...