将表单字符串输入值自动转换为其他java类型以动态生成类实例

jas*_*ena 6 java generics apache-commons-beanutils

我有一个只接受String变量的表单,但我想生成一个Class实例,使每个字符串属性转换为类中属性名称标识的相应类型.

对于例如,如果我在与名称的形式三个字段NAME,ANNUAL SALARYisLocalResident.我想将此表单转换为Class1这些属性所在的实例String,BigIntegerBoolean键入.

我怎么做?

目前我正在使用BeanUtiljava的属性,但它不符合我的要求,因为它不会转换为其所需的类型; 相反,它问我一个所需类型的二传手和吸气剂.请帮我解决这个问题.任何建议将不胜感激?

请注意,此表单是动态的,即字段的数量和名称应取决于另一个输入. 以下代码表示emp1Employee1类生成实例.

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;
}
Run Code Online (Sandbox Code Playgroud)

Bec*_*ang 0

关键点是将字段名称转换为 Java Bean 属性名称。toPropertyName方法是基于您问题示例的简单实现。(注意!如果您需要支持嵌套 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;
}
Run Code Online (Sandbox Code Playgroud)

BeanUtils.populate(emp1, map)API用于承担其他工作。它转换输入的值并调用每个 Java Bean 属性的 setter。