哪个Java库允许我从属性文件初始化对象的属性?

时间:2010-05-21 07:32:05

标签: java

是否有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 个答案:

答案 0 :(得分:8)

使用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

按键和年龄会动态转换为数字。必须事先创建keys数组,对于Person也是如此。

答案 1 :(得分:1)

图书馆?这只是几行代码:

对于每一个键:

  1. 将密钥名称转换为setter方法名称(基本字符串操作)
  2. 从配置类对象(反射API)
  3. 获取Method对象
  4. 使用值作为参数(调用API)
  5. 调用配置对象的setter

    您甚至可以将其添加到配置类并实现读取Properties对象的构造函数。

答案 2 :(得分:1)

使用内省类BeanInfo执行此操作非常简单。

e.g。它的核心就是这样的。

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

答案 3 :(得分:1)

我将Preferences用于此

答案 4 :(得分:0)

我会看看commons configuration,看看它是否存在使用它的等效commons digester

答案 5 :(得分:0)

只有部分答案:查找第一部分的Properties。有加载/存储的方法。

我不记得确切,但我在某个地方读了一些关于这个课的讨论,说它有一个有趣的设计。它特别继承Hashtable,但并不严格地表现得像Hashtable。我不记得这些论点,但我认为在这种情况下,is-a关系并不是真正正确的事实。

答案 6 :(得分:0)

我会说你自己做(正如Andreas_D所建议的那样),它真的很简单,唯一的“硬”部分是进行类型转换。

但如果您真的想使用库来实现这一点,您可能会发现OGNL中强大的表达式语法很有帮助。

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

  1. 将属性文件加载到属性对象
  2. 创建您感兴趣的对象的实例。
  3. 将此项目放入OGNL堆栈。
  4. 对于每个属性,使用OGNL堆栈设置值。 (类似于stack.setValue( "property", value );
  5. 额外的好处是您可以使用完整的OGNL语法访问组件对象的属性。您可以执行stack.setValue( "property.name", value );之类的操作,其中getProperty()返回并使用get/setName()方法进行对象。

答案 7 :(得分:0)

如果使用xml而不是属性,则可以使用JaxB。