package org.arong.util;
import java.beans.Introspector;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Pattern;
public class BeanUtil {
/**
* 实现与BeanUtils.setProperty()类似功能
*
* @param obj
* @param name
* @param values
*/
public static void setProperty(Object obj, String name, String[] values) {
Class<?> clazz = obj.getClass();
Method[] methods = clazz.getDeclaredMethods();
String methodName = null;
String propertyName = null;
String propertyType = null;
for (int i = 0; i < methods.length; i++) {
methodName = methods[i].getName();
if (methodName.startsWith("set")) {
propertyName = Introspector.decapitalize(methodName.substring(
3, methodName.length()));
if (propertyName.equals(Introspector.decapitalize(name))) {
propertyType = methods[i].getParameterTypes()[0]
.getCanonicalName();
try {
methods[i].invoke(obj, converter(values, propertyType));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 将一个String数组进行类型转换<br>
* 当数组长度为1时,返回值为非数组
*
* @param values
* 字符串数组
* @param typeName
* 类型全限定名
* @return
*/
private static Object converter(String[] values, String typeName) {
if (values == null) {
return null;
} else if (values.length == 1) {
String value = values[0];
if (typeName == null)
return null;
else if (typeName.trim().equals("java.lang.String")) {
return value;
} else if (typeName.trim().equals("java.lang.Integer")) {
return NumberUtil.can2Int(value) ? Integer.parseInt(value) : 0;
} else if (typeName.trim().equals("int")) {
return NumberUtil.can2Int(value) ? Integer.parseInt(value) : 0;
} else if (typeName.trim().equals("java.lang.Long")) {
return Long.parseLong(value);
} else if (typeName.trim().equals("long")) {
return Long.parseLong(value);
} else if (typeName.trim().equals("java.lang.Double")) {
return Double.parseDouble(value);
} else if (typeName.trim().equals("double")) {
return Double.parseDouble(value);
} else if (typeName.trim().equals("java.lang.Float")) {
return Float.parseFloat(value);
} else if (typeName.trim().equals("float")) {
return Float.parseFloat(value);
} else if (typeName.trim().equals("java.util.Date")) {
return String2Date(value);
} else if (typeName.trim().equals("java.sql.Date")) {
return new java.sql.Date(String2Date(value).getTime());
} else
return null;
} else {
if (typeName == null)
return null;
else if (typeName.trim().equals("java.lang.String[]")) {
return values;
} else if (typeName.trim().equals("java.lang.Integer[]")) {
return NumberUtil.parseInt(values);
} else if (typeName.trim().equals("int[]")) {
return NumberUtil.parseInt(values);
} else if (typeName.trim().equals("java.lang.Long[]")) {
Long[] longs = new Long[values.length];
for (int i = 0; i < values.length; i++) {
longs[i] = Long.parseLong(values[i]);
}
return longs;
} else if (typeName.trim().equals("long[]")) {
Long[] longs = new Long[values.length];
for (int i = 0; i < values.length; i++) {
longs[i] = Long.parseLong(values[i]);
}
return longs;
} else if (typeName.trim().equals("java.lang.Double[]")) {
Double[] doubles = new Double[values.length];
for (int i = 0; i < values.length; i++) {
doubles[i] = Double.parseDouble(values[i]);
}
return doubles;
} else if (typeName.trim().equals("double[]")) {
Double[] doubles = new Double[values.length];
for (int i = 0; i < values.length; i++) {
doubles[i] = Double.parseDouble(values[i]);
}
return doubles;
} else if (typeName.trim().equals("java.lang.Float[]")) {
Float[] floats = new Float[values.length];
for (int i = 0; i < values.length; i++) {
floats[i] = Float.parseFloat(values[i]);
}
return floats;
} else if (typeName.trim().equals("float[]")) {
Float[] floats = new Float[values.length];
for (int i = 0; i < values.length; i++) {
floats[i] = Float.parseFloat(values[i]);
}
return floats;
} else if (typeName.trim().equals("java.util.Date[]")) {
Date[] dates = new Date[values.length];
for (int i = 0; i < values.length; i++) {
dates[i] = String2Date(values[i]);
}
return dates;
} else if (typeName.trim().equals("java.sql.Date[]")) {
java.sql.Date[] dates = new java.sql.Date[values.length];
for (int i = 0; i < values.length; i++) {
dates[i] = new java.sql.Date(String2Date(values[i])
.getTime());
}
return dates;
} else
return null;
}
}
/**
* 将日期形式的字符串转换为Date
*
* @param s
* @return
*/
private static Date String2Date(String s) {
Date date = null;
Locale locale = Locale.CHINA;
DateFormat format = null;
if (Pattern.matches("\\d{4}.\\d{1,2}.\\d{1,2}", s)) {
format = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
} else if (Pattern.matches("\\d{2}.\\d{2}.\\d{2}", s)) {
format = DateFormat.getTimeInstance(DateFormat.MEDIUM, locale);
} else if (Pattern.matches(
"\\d{4}.\\d{1,2}.\\d{1,2}[ ]\\d{1,2}.\\d{1,2}.\\d{1,2}", s)) {
format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
DateFormat.MEDIUM, locale);
} else {
format = new SimpleDateFormat("yyyy-MM-dd");
}
try {
date = format.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}