解释主要在代码里,在这里就不多废话了,直接上代码:
package onlyfun.caterpillar;
public class Student {
private String name;
private int score;
public Student() {
name = "N/A";
}
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public void setName(String name) {
this.name = name;
}
public void setScore(int score) {
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
public String toString() {
return name + ":" + score;
}
}
package onlyfun.caterpillar;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Map;
public class CommandUtil {
// 给定Map对象及要产生的Bean类名称
// 可以取回已经设定完成的对象
public static Object getCommand(Map requestMap,
String commandClass)
throws Exception {
Class c = Class.forName(commandClass);
Object o = c.newInstance();
return updateCommand(requestMap, o);
}
// 使用reflection自动找出要更新的属性
public static Object updateCommand(
Map requestMap,
Object command)
throws Exception {
Method[] methods =
command.getClass().getDeclaredMethods();
for(int i = 0; i < methods.length; i++) {
// 略过private、protected成员
// 且找出必须是set开头的方法名称
if(!Modifier.isPrivate(methods[i].getModifiers()) &&
!Modifier.isProtected(methods[i].getModifiers()) &&
methods[i].getName().startsWith("set")) {
// 取得不包括set的名称
String name = methods[i].getName()
.substring(3)
.toLowerCase();
// 如果setter名称与键值相同
// 呼叫对应的setter并设定值
if(requestMap.containsKey(name)) {
String param = (String) requestMap.get(name);
Object[] values = findOutParamValues(
param, methods[i]);
methods[i].invoke(command, values);
}
}
}
return command;
}
// 转换为对应类型的值
private static Object[] findOutParamValues(
String param, Method method) {
Class[] params = method.getParameterTypes();
Object[] objs = new Object[params.length];
for(int i = 0; i < params.length; i++) {
if(params[i] == String.class) {
objs[i] = param;
}
else if(params[i] == Short.TYPE) {
short number = Short.parseShort(param);
objs[i] = new Short(number);
}
else if(params[i] == Integer.TYPE) {
int number = Integer.parseInt(param);
objs[i] = new Integer(number);
}
else if(params[i] == Long.TYPE) {
long number = Long.parseLong(param);
objs[i] = new Long(number);
}
else if(params[i] == Float.TYPE) {
float number = Float.parseFloat(param);
objs[i] = new Float(number);
}
else if(params[i] == Double.TYPE) {
double number = Double.parseDouble(param);
objs[i] = new Double(number);
}
else if(params[i] == Boolean.TYPE) {
boolean bool = Boolean.parseBoolean(param);
objs[i] = new Boolean(bool);
}
}
return objs;
}
}
package onlyfun.caterpillar;
import java.util.*;
public class CommandUtilDemo {
public static void main(String[] args) throws Exception {
Map request =
new HashMap();
request.put("name", "wenhaozhong");
request.put("score", "90");
// Object obj = CommandUtil.getCommand(request, args[0]);
Object obj = CommandUtil.getCommand(request, "onlyfun.caterpillar.Student");
System.out.println(obj);
}
}
输出结果为: