反射小练习
前言
最近通过视频学习了一下反射,在实际工作之中遇到了一些小问题,于是乎就想着通过反射来解决问题。在业余时间里头,自己写个工具类来玩玩。
问题的描述
简单描述一下,在自己的工作之中,遇到这样子的问题:发送报文,然后从对方那里获取报文,报文解析后将其数据赋值给 JavaBean;
发送过来的日期格式,他们统一是 yyyyMMdd 的格式;
而我们接收的对象,日期则以 String 类型接收,命名大多以 Date 结尾;
一个 JavaBean 之中有时候有很多条日期;
在前端页面显示时,则要求 yyyy-MM-dd;
已有的一个工具类,则是传入一个字符串(yyyyMMdd 格式),返回一个 yyyy-MM-dd 格式的字符串,如果某个 JavaBean 之中只有一两条日期,则调用这个方法给成员变量重新赋值即可。可一旦有多条日期需要这样子处理时,却显得麻烦。
设想
写一个工具类,写一个方法,在这个方法之中传入所要日期处理的对象;
通过反射获取所有日期成员变量名称;
递归处理;
通过 public Method getMethod(String name, Class
工具类
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* 描述:处理对象中的日期成员变量
* @author Hochen
* @date 2017-11-06
* @version 0.2
*/
public class ObjectDateUtils {
/**
* 传入一个对象,将对象中的日期形如 yyyyMMdd 全部转换为 yyyy-MM-dd
*/
public static void objectDateFormat(Object obj) {
// 判断传入的对象是否为 null,为 null 则不进行任何操作
if (null != obj) {
Class<?> cls = obj.getClass();
Field[] fields = cls.getDeclaredFields();
// 为了方便起见,假设对象里的日期以 String 类型存储,命名之中包含 date
// 获取所有日期成员变量的名称,将这些名称存储到 dateNames 之中
List<String> dateNames = new ArrayList<String>();
for (Field field : fields) {
String fieldName = field.getName();
// 不区分命名之中是否包含大小写的 date
if (fieldName.toLowerCase().indexOf("date") != -1) {
dateNames.add(fieldName);
}
}
for (String dateName : dateNames) {
try {
Method setMet = cls.getMethod("set" + dateName.substring(0, 1).toUpperCase() + dateName.substring(1), String.class);
Method getMet = cls.getMethod("get" + dateName.substring(0, 1).toUpperCase() + dateName.substring(1));
// 获取原本的日期
String date = (String) getMet.invoke(obj);
// 简单判断一下日期
if (null != date
&& !"".equals(date)
&& date.matches("\\d+")
&& 8 == date.length()) {
String newDate = date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6);
setMet.invoke(obj, newDate);
}
} catch (Exception e) {
// 简单处理异常
e.printStackTrace();
}
}
}
}
}
测试
class Book {
private String startDate;
private String endDate;
public String getStartDate() {
return startDate;
}
public void setStartDate(String startDate) {
this.startDate = startDate;
}
public String getEndDate() {
return endDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
}
public class DateTest {
public static void main(String[] args) {
Book book = new Book();
book.setStartDate("20171106");
book.setEndDate("20171107");
// 调用工具类,传入对象
ObjectDateUtils.ObjectDateFormat(book);
// 输出结果看看
System.out.println(book.getStartDate());
System.out.println(book.getEndDate());
}
}
运行结果:
2017-11-06
2017-11-07
后记
刚好最近学习到,那就拿来用一下,业余时间里头自己练练手。也想着有些操作不想重复性的劳动。不过因为项目组之中有自己的工具,即使麻烦点,但是毕竟经过了考验,所以项目负责人觉得没必要这样子使用,还是继续老样子写即可。
这个也就当做自己业余时间练手,顺带做下笔记,记录一下自己的成长。
编辑:HochenChong
时间:2017-11-06