2010-05-21 54 views
3

是否有一个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应用pro中的所有值将文件复制到Connection实例。

是否有类似这样的图书馆?

回答

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 

键和年龄转换为数字的飞行。键数组必须预先创建,但对Person来说是一样的。

0

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

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

+0

+1同与Stack类扩展向量OO – helpermethod 2010-05-21 09:42:11

1

一个库?它的代码,只需几行:

对于每一个关键:

  1. 转换键名成setter方法名(基本字符串操作)
  2. 获取从配置类的Method对象对象(反射API)
  3. 调用配置对象的setter与值作为参数(调用API)

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

+1

当然,我可以写我自己,但如果已经有一个标准溶液我可以重用我赢了”麻烦了。 – 2010-05-21 07:59:56

0

我想说的就是自己做(正如Andreas_D所建议的那样),它确实很简单,唯一的'硬'部分就是进行类型转换。

但是,如果你真的想用库来做到这一点,你可能会发现OGNL中强大的表达式语法有用。

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

  1. 装入特性文件到Properties对象
  2. 创建将这个项目到OGNL栈你感兴趣的对象。
  3. 的一个实例。
  4. 对于每个属性,使用OGNL堆栈来设置值。 (类似于stack.setValue("property", value);

额外的好处是您可以使用完整的OGNL语法访问组件对象的属性。您可以执行类似stack.setValue("property.name", value);的操作,其中有一个getProperty()返回并且使用get/setName()方法对象。

0

如果使用xml代替属性,则可以使用JaxB。

1

使用introspection类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); 
     } 
    } 
}