2016-09-21 38 views
6

我有一個表格只接受String變量,但我想生成一個Class實例,以便將每個字符串屬性轉換爲其對應的類型由類別中的屬性名稱標識。自動將表單字符串輸入值轉換爲其他Java類型動態生成類實例

例如,如果我有一個名稱爲NAMEANNUAL SALARYisLocalResident的表單中的三個字段。我想將此表單轉換爲Class1的實例,其中這些屬性的格式爲StringBigIntegerBoolean類型。

我該怎麼做?

目前我正在使用BeanUtil java屬性,但它不符合我的要求,因爲它不會轉換爲其所需的類型;相反,它讓我想到了一種理想類型的二傳手和吸氣器。 請幫我解決這個問題。任何建議,將不勝感激?

P注意,這種形式是動態的,即字段的數量和名稱應取決於另一個輸入。 以下代碼表示Employee1類的生成實例emp1

public Empolyee1 setContent(List<String> nameList, List<String> valueList) { 
    Empolyee1 emp1 = new Empolyee1(); 

    for(String attr : nameList) { 
     if(attr.equalsIgnoreCase("name")) { 
      if(valueList.get(nameList.indexOf("name")) != null && !valueList.get(nameList.indexOf("name")).trim().equals("")) { 
       emp1.setName(valueList.get(nameList.indexOf("name"))); 
      } 
    } else { 
     if(attr.equalsIgnoreCase("ANNUAL SALARY")) { 
      if(valueList.get(nameList.indexOf("ANNUAL SALARY")) != null && !valueList.get(nameList.indexOf("ANNUAL SALARY")).trim().equals("")) { 
        emp1.setAnnualSalary(valueList.get(nameList.indexOf("ANNUAL SALARY"))); 
      } 
     } else { 
      if(attr.equalsIgnoreCase("isLocalResident")) { 
       if(valueList.get(nameList.indexOf("isLocalResident")) != null && !valueList.get(nameList.indexOf("isLocalResident")).trim().equals("")) { 
        emp1.setIsLocalResident(valueList.get(nameList.indexOf("isLocalResident")));  
       } 
      } 
     } 
    } 
    return empl1; 
} 
+0

目前還不清楚:你想實例化一個動態數量的屬性(動態類型)的類自動轉換?你不知道屬性的數量和類型,但是你知道屬性的總數和類型嗎?你是否知道(例如)50個可能的屬性,在表單中可以組合每個排列? –

+0

請參閱此。 http://stackoverflow.com/questions/13868986/dynamically-create-an-object-in-java-from-a-class-name-and-set-class-fields-by-u – Vel

+0

@AndreaLigios,是的,我知道屬性的總體數量和類型。例如,我有10個不同的類,總數爲100個屬性。每個類可以有不同數量的屬性。我有10個包含getter和setter的類中的每一個都有xsd。現在,我必須設置從UI中選擇的類。 –

回答

0

關鍵是將字段名稱轉換爲Java Bean屬性名稱。 toPropertyName方法是基於您的問題示例的簡單實現。 (Bewared!如果你需要支持嵌套bean屬性,確保您的代碼防止CVE-2014-0114潛在的類裝載器漏洞...)

public static String toPropertyName(String s) { 
    int len = s.length(); 
    StringBuilder sb = new StringBuilder(len); 
    boolean toUpper = false; 
    boolean isLower = false; 
    for (int i = 0; i < len; i++) { 
     char ch = s.charAt(i); 
     if (Character.isLetterOrDigit(ch)) { 
      if (Character.isUpperCase(ch)) { 
       sb.append((toUpper || isLower)?ch:Character.toLowerCase(ch)); 
       isLower = false; 
      } else { 
       isLower = true; 
       sb.append(toUpper?Character.toUpperCase(ch):ch); 
      } 
      toUpper = false; 
     } else { 
      isLower = false; 
      toUpper = true; 
     } 
    } 
    return sb.toString(); 
} 

public Empolyee1 setContent(List<String> nameList, List<String> valueList) throws Exception { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    Iterator<String> nameIter = nameList.iterator(); 
    Iterator<String> valueIter = valueList.iterator(); 
    while (nameIter.hasNext()) { 
     String name = (String) nameIter.next(); 
     map.put(toPropertyName(name), valueIter.hasNext()?valueIter.next():null); 
    } 
    Empolyee1 emp1= new Empolyee1(); 
    BeanUtils.populate(emp1, map); 
    return emp1; 
} 

BeanUtils.populate(emp1, map) API用於採取其他的工作。它轉換輸入值並調用每個Java Bean屬性的setter。

相關問題