最近做一个excel的模板导入,想做成动态性质的模板(大体上是模板中有几个属性,就放几个属性的值到bean中,用于存取)。
当时就想到反射机制,巴拉巴拉出来。
前期的准备工作介绍一下:
- 读取excel,以二维数组的形式 excelDatas[][]
- 读取数组的第一行模板,将模板属性和下标以Map的形式存储 titleIndex (在这之前有一个中英对照的静态Map,所以 titleIndex 中的key是 set + “属性名”的格式)
具体实现代码:
//时间格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<ProcessPlanSplitDTO> addWbsList = newArrayList<ProcessPlanSplitDTO>();
//第一行是模板,不取
for(int i=1; i<excelDatas.length; i++){
ProcessPlanSplitDTO addWbs=new ProcessPlanSplitDTO();
for(String met : titleIndex.keySet()){
if(met.equals("setWbFlag")){
addWbs.getClass().getMethod(met, Integer.class).invoke(addWbs, Integer.parseInt(excelDatas[i][titleIndex.get(met)]));
}else if(met.equals("setPlanBeginTime") || met.equals("setPlanFinishTime")){
Date date = sdf.parse(excelDatas[i]titleIndex.get(met)]);
addWbs.getClass().getMethod(met, Date.class).invoke(addWbs, date);
}else{
addWbs.getClass().getMethod(met, String.class).invoke(addWbs, excelDatas[i][titleIndex.get(met)]);
}
}
addWbsList.add(addWbs);
}
当时做完之后,感觉自己对反射的原理不够清晰,大体上只是会用,因此上网看了看,这里做一个理解记录;
一些概念性的东西,大家可以看看这些篇文章:
Java反射机制:
http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html
学习:java原理—反射机制:
http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html对于“动态”的描述,说一下个人理解:
- 在java中new出来的对象,就是静态编译的,表明在编译时已经将这个模块放进去了,然后jvm去执行的是一个已经完全准备好的程序;
- 而反射的动态编译是指,在jvm去执行的时候才去编译。
从代码角度看,反射的前提是获取类对象 .class Class.forName() Class.forName():
.class getClass () forName() 详解 :
http://www.cnblogs.com/java-class/p/4496432.html
Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别 :
http://blog.sina.com.cn/s/blog_7ffb8dd5010127ix.html在我的理解中流程是这样的:
java文件编译为class文件,执行时将class文件放入内存中,而上面的这3个方法,就是内存中class文件的对象索引,获取对象 然后对这个对象经行操作。 具体的区别文章中讲解的很清晰了。