阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第24章:反射与简单Java类:课时112:设置多种数据类型

现在已经成功的实现了单级的属性配置,但是这里面依然需要考虑一个实际的情况,当前所给定的数据类型只是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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值