现在已经成功的实现了单级的属性配置,但是这里面依然需要考虑一个实际的情况,当前所给定的数据类型只是String,但是在实际的开发之中面对简单java类中的属性类型一般的可选为:long(Long)、int(Integer)、double(Double)、String、Date(日期、日期时间),所以这个时候对于当前的程序代码就必须做出修改,要求可以实现各种数据类型的配置。
既然要求可以实现不同类型的内容设置,并且BeanUtils类主要是完成属性赋值处理的,那么就可以在这个类之中追加有一系列的处理方法。
class BeanUtils { // 进行Bean处理的类
private BeanUtils() {}
/**
* 实现指定对象的属性设置
* @param obj 要进行反射操作的实例化对象
* @param value 包含有指定内容的字符串,格式“属性:内容|属性:内容”
*/
public static void setValue(Object obj,String value) {
String results [] = value.split("\\|"); // 按照“|”进行每一组属性的拆分
for (int x = 0; x < results.length; x++) { // 循环设置属性内容
// attval[0]保存的是属性名称、attval[1]保存的是属性内容
String attval [] = results[x].split(":"); // 获取“属性名称”与内容;
try {
Field field = obj.getClass().getDeclaredField(attval[0]); // 获取成员
Method setMethod = obj.getClass().getDeclaredMethod("set" + StringUtils.initcap(attval[0]),field.getType());
Object convertValue = BeanUtils.convertAttributeValue(field.getType().getName(), attval[1]);
setMethod.invoke(obj, convertValue); // 调用setter方法设置内容
} catch (Exception e) {}
}
}
/**
* 实现属性类型转换处理
* @param type 属性类型,通过Field获取的
* @param value 属性的内容,传入的都是字符串,需要将其变为指定类型
* @return 转换后的数据
*/
private static Object convertAttributeValue(String type,String value) {
if ("long".equals(type) || "java.lang.Long".equals(type)) { // 长整型
return Long.parseLong(value);
} else if ("int".equals(type) || "java.lang.int".equals(type)) {
return Integer.parseInt(value);
} else if ("double".equals(type) || "java.lang.double".equals(type)) {
return Double.parseDouble(value);
} else if ("java.util.Date".equals(type)) {
SimpleDateFormat sdf = null;
if (value.matches("\\d{4}-\\d{2}-\\d{2}")) { // 日期类型
sdf = new SimpleDateFormat("yyyy-MM-dd");
} else if (value.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
} else {
return new Date(); // 当前日期
}
try {
return sdf.parse(value);
} catch (ParseException e) {
return new Date(); // 当前日期
}
} else {
return value ;
}
}
}
此时只是列举出了常用的几种数据类型,如果要想将其作为一个产品推广,你必须要考虑所有可能出现的类型,同时所有可能出现的日期格式也需要考虑。
=====================================================================
完整代码:
package cn.mldn.demo;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
String value = "empno:7349|ename:Smith|job:Clerk|salary:750.00|hiredate:1989-10-10";
Emp emp = ClassInstanceFactory.create(Emp.class, value) ;
System.out.println("雇员编号:" + emp.getEmpno() + "、姓名:" + emp.getEname() + "、职位:" + emp.getJob() + "、基本工资:" + emp.getSalary() + "、雇佣日期:" + emp.getHiredate());
}
}
class ClassInstanceFactory {
private ClassInstanceFactory() {}
/**
* 实例化对象的创建方法,该对象可以根据传入的字符串结构“属性:内容|属性:内容”
* @param clazz 要进行反射实例化的Class类对象,有Class就可以反射实例化对象
* @param value 要设置给对象的属性内容
* @return 一个已经配置好属性内容的简单Java类对象
*/
public static <T> T create(Class<?> clazz,String value) {
try { // 如果要想采用反射进行简单Java类对象属性设置的时候,类中必须要有无参构造
Object obj = clazz.getDeclaredConstructor().newInstance();
BeanUtils.setValue(obj, value); // 通过反射设置属性
return (T) obj ; // 返回对象
} catch (Exception e) {
e.printStackTrace(); // 如果此时真的出现了错误,本质上抛出异常也没用
return null ;
}
}
}
class StringUtils {
public static String initcap(String str) {
if (str == null || "".equals(str)) {
return str ;
}
if (str.length() == 1) {
return str.toUpperCase();
} else {
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
}
}
class BeanUtils { // 进行Bean处理的类
private BeanUtils() {}
/**
* 实现指定对象的属性设置
* @param obj 要进行反射操作的实例化对象
* @param value 包含有指定内容的字符串,格式“属性:内容|属性:内容”
*/
public static void setValue(Object obj,String value) {
String results [] = value.split("\\|"); // 按照“|”进行每一组属性的拆分
for (int x = 0; x < results.length; x++) { // 循环设置属性内容
// attval[0]保存的是属性名称、attval[1]保存的是属性内容
String attval [] = results[x].split(":"); // 获取“属性名称”与内容;
try {
Field field = obj.getClass().getDeclaredField(attval[0]); // 获取成员
Method setMethod = obj.getClass().getDeclaredMethod("set" + StringUtils.initcap(attval[0]),field.getType());
Object convertValue = BeanUtils.convertAttributeValue(field.getType().getName(), attval[1]);
setMethod.invoke(obj, convertValue); // 调用setter方法设置内容
} catch (Exception e) {}
}
}
/**
* 实现属性类型转换处理
* @param type 属性类型,通过Field获取的
* @param value 属性的内容,传入的都是字符串,需要将其变为指定类型
* @return 转换后的数据
*/
private static Object convertAttributeValue(String type,String value) {
if ("long".equals(type) || "java.lang.Long".equals(type)) { // 长整型
return Long.parseLong(value);
} else if ("int".equals(type) || "java.lang.int".equals(type)) {
return Integer.parseInt(value);
} else if ("double".equals(type) || "java.lang.double".equals(type)) {
return Double.parseDouble(value);
} else if ("java.util.Date".equals(type)) {
SimpleDateFormat sdf = null;
if (value.matches("\\d{4}-\\d{2}-\\d{2}")) { // 日期类型
sdf = new SimpleDateFormat("yyyy-MM-dd");
} else if (value.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
} else {
return new Date(); // 当前日期
}
try {
return sdf.parse(value);
} catch (ParseException e) {
return new Date(); // 当前日期
}
} else {
return value ;
}
}
}
class Emp {
private long empno ;
private String ename;
private String job ;
private double salary ;
private Date hiredate;
public void setEname(String ename) {
this.ename = ename ;
}
public void setJob(String job) {
this.job = job;
}
public String getEname() {
return ename;
}
public String getJob() {
return job;
}
public Long getEmpno() {
return empno;
}
public void setEmpno(long empno) {
this.empno = empno;
}
public void setEmpno(Long empno) {
this.empno = empno;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
}