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;
}
}