jas*_*ena 6 java generics apache-commons-beanutils
我有一个只接受String变量的表单,但我想生成一个Class实例,使每个字符串属性转换为类中属性名称标识的相应类型.
对于例如,如果我在与名称的形式三个字段NAME,ANNUAL SALARY和isLocalResident.我想将此表单转换为Class1这些属性所在的实例String,BigInteger并Boolean键入.
我怎么做?
目前我正在使用BeanUtiljava的属性,但它不符合我的要求,因为它不会转换为其所需的类型; 相反,它问我一个所需类型的二传手和吸气剂.请帮我解决这个问题.任何建议将不胜感激?
请注意,此表单是动态的,即字段的数量和名称应取决于另一个输入.
以下代码表示emp1为Employee1类生成实例.
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)
关键点是将字段名称转换为 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。