是否有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实例。
是否有类似这样的类的库?
答案 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)
图书馆?这只是几行代码:
对于每一个键:
您甚至可以将其添加到配置类并实现读取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/
stack.setValue( "property", value );
)额外的好处是您可以使用完整的OGNL语法访问组件对象的属性。您可以执行stack.setValue( "property.name", value );
之类的操作,其中getProperty()
返回并使用get/setName()
方法进行对象。
答案 7 :(得分:0)
如果使用xml而不是属性,则可以使用JaxB。