2013-10-03 89 views
0

如何在從java中的table/s中讀取列之後動態創建bean/s(在bean中保留列數據類型)?如何動態創建java bean?

+0

您沒有訪問數據庫架構?我在想你爲什麼需要首先動態創建bean – Sujay

+0

@Sujay假設你有一個SQL編輯器,它接受任何sql然後運行。你會如何表示數據?你需要一個動態bean綁定到網格。 –

回答

0

有幾個可用於幫助您生成類的框架/庫。 Evgeniy建議javassist。還有類似的庫,比如cglib,asm以及你可以探索的。

但是我真的很想知道更多關於你的用例,因爲在我看來,動態生成的類在靜態類型語言(如Java)中有其缺點。另外,獲取字段數據類型需要使用Java反射機制進行反思。這本身就增加了複雜性。

我建議,以下任一操作:

  • 如果你對數據庫的訪問模式,考慮事先生成bean類。有幾個工具/插件可用於您最喜愛的IDE來實現此目的。

  • 考慮將數據存儲在Map接口的實現中。例如,您可以使用其中的一種將您的列標識映射到數據類型,使用另一種映射列標識與檢索到的數據。然後,您可以在代碼中使用這兩個映射,而無需在運行時創建任何Bean。

2

UPDATE 以前的答案是立即解決這個問題的一種嘗試。所以這不是FlexBean的最終代碼。 對於最終的代碼,請訪問:https://github.com/ramazanpolat/flexbean

OLD ANSWER

我有同樣的問題,所以我寫了FlexBean。

public class FlexBean { 
    private List<String> propertyNames = new ArrayList<>(); 
    private Map<String, Object> propertyValueMap = new LinkedHashMap<>(); 
    private List<Type> propertyTypes = new ArrayList<>(); 

    public FlexBean() { 

    } 

    public void setProperties(Map<String, Object> props){ 
     for (String propName:props.keySet()){ 
      addProperty(propName, props.get(propName)); 
     } 
    } 


    public void addPropertyNames(List<String> propertyNames){ 
     for (String name: propertyNames) { 
      addProperty(name); 
     } 
    } 

    public Collection<Object> getPropertyValues(){ 
     return propertyValueMap.values(); 
    } 

    public List<String> getPropertyNames() { 
     return propertyNames; 
    } 

    public Map<String, Object> getPropertyValueMap() { 
     return propertyValueMap; 
    } 

    public List<Type> getPropertyTypes() { 
     return propertyTypes; 
    } 

    public void addProperty(String propName, Type propType){ 
     propertyNames.add(propName); 
     propertyTypes.add(propType); 
    } 

    public void addProperty(String propName){ 
     // default property type is String 
     addProperty(propName, String.class); 
    } 

    public void addProperty(String propName, Object value){ 
     addProperty(propName); 
     setProperty(propName, value); 
    } 

    public void addProperty(String propName, Type propType, Object value){ 
     addProperty(propName, propType); 
     setProperty(propName, value); 
    } 

    public int getPropertyIndex(String propName){ 
     return propertyNames.indexOf(propName); 
    } 

    public Type getPropertyType(String propName){ 
     int index = getPropertyIndex(propName); 
     return Iterables.get(propertyTypes,index); 
    } 

    public void setProperty(String propName, Object propValue){ 
     propertyValueMap.put(propName, propValue); 
    } 

    public Object getPropertyValue(String propName){ 
     return propertyValueMap.get(propName); 
    } 

    public <Any> Any getTypedPropertyValue(String propName){ 
     return (Any)((Any) propertyValueMap.get(propName)); 
    } 

    public Object getProperty(int propIndex){ 
     return Iterables.get(propertyValueMap.entrySet(),propIndex).getValue(); 
    } 
} 

用法:

FlexBean flexBean = new FlexBean(); 

flexBean.addProperty("prop1", 1); // int inferred 
flexBean.addProperty("prop2", "value2"); // string inferred 
flexBean.addProperty("prop3", 0.1f); // float inferred 

for (Object o: flexBean.getPropertyValues()) { 
    System.out.println(o); 
} 

int prop1 = flexBean.getTypedPropertyValue("prop1"); 
String prop2 = flexBean.getTypedPropertyValue("prop2"); 
float prop3 = flexBean.getTypedPropertyValue("prop3");