2010-05-21 55 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); 
     } 
    } 
}