java学习之反射应用

 一,先看一下反射的概念:

              主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

             反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!

           这些概念看起来一点都不直观。还是用实际应用来解释更容易理解一些

 

 二,反射机制的作用:

              1,反编译:.class-->.java

              2,通过反射机制访问java对象的属性,方法,构造方法等;

             这样好像更容易理解一些,下边我们具体看怎么实现这些功能。


三,在这里先看一下sun为我们提供了那些反射机制中的类:

java.lang.Class;                
java.lang.reflect.Constructor; java.lang.reflect.Field;        

java.lang.reflect.Method;

java.lang.reflect.Modifier;

详细的各个关于反射的方法请到一下网址查看:

http://blog.csdn.net/liujiahan629629/article/details/18013523

https://www.zhihu.com/question/24304289


下面是实际应用:


四:实际应用到项目

场景:将数据从数据库中导入到excel表中。

1先查出导入的模板:

//导出模板为创建案件批次时,把关联导入模板复制到导出模板表中 (case库t_download_template表)DownLoadTemplate templateDates = downLoadTemplateMapper.select(record);

通过反射将获取的模板内容对应的json串按名和值对应的赋给ColumnTem类

template=templateDates.getTemplate();

List<ColumnTem> list = JSON.parseArray(template, ColumnTem.class);

备注:获取到的模板json串:

[{"word":"contactname","name":" 联系人姓名"},{"word":"relation","name":"关系"},{"word":"info","name":"联系方式(电话/地址)"},{"word":"coofficeaddr","name":"联系人单位地址"},{"word":"contactname","name":" 联系人姓名"},{"word":"relation","name":"关系"},{"word":"info","name":"联系方式(电话/地址)"},{"word":"coofficeaddr","name":"联系人单位地址"}]


columntem实体类

public class ColumnTem {
	private String word;
	private String name;

	public String getWord() {
		return word;
	}

	public void setWord(String word) {
		this.word = word;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "ColumnTem [word=" + word + ", name=" + name + "]";
	}

for (int i = 0; i < list.size(); i++) {
ColumnTem columnTem = list.get(i);
exceltemplate[i] = columnTem.getName();//中文名
exceltemplateColumn[i] = columnTem.getWord();//对应的casebo实体字段名
}
// 1.通过批次来查询案件
List<CaseBo> caseList = caseHeadMapper.selectHeadDetailByExampleNOTWx(example, caseDetail, caseWhereUtis,example.getCompanycode());
caseBos.addAll(caseList);
//通过反射获取类的所有属性
Field fields[] = caseBos.get(i).getClass().getDeclaredFields();// 获得对象所有属性
for (int p1 = 0; p1 < fields.length; p1++) {//循化获取到的字段
for (int j = 0; j < exceltemplateColumn.length; j++) {//循环模板的对应实体字段
if (exceltemplateColumn[j] != null) {
if (exceltemplateColumn[j].equals(fields[p1].getName())) {//如果反射获取到的属性名与模板存的对应实体类的字段名一致
fields[p1].setAccessible(true);//当isAccessible()的结果是false时不允许通过反射访问字段,当该字段时private修饰时isAccessible()得到的值是false,必须要改成true才可以访问,所以     f.setAccessible(true);得作用就是让我们在用反射时访问私有变量
if("class java.util.Date".equals(fields[p1].getType().toString())){//反射获取属性的类型
if(fields[p1].get(caseBos.get(i))!=null){//去空
map.put(fields[p1].getName(), sdf.format((Date)(fields[p1].get(caseBos.get(i)))));//向map里存入获取反射得到的属性名,和时间
}
}else{
map.put(fields[p1].getName(),fields[p1].get(caseBos.get(i)));//向map里存入获取反射得到的属性名,和时间
}
}
}
}
}
maps.add(map);
ExcelFile.writeExcelIncludeData(os, exceltemplate, exceltemplateColumn, maps);





/**
* 导出表头和数据
* 
* @param oupOutputStream
* @param fieldName
* @param mapList
*/
public static void writeExcelIncludeData(OutputStream oupOutputStream,
String[] fieldName,String[] dataName,List<Map<String, Object>> mapList) {
try {
// 创建一个webbook,对应一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
// 在webbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet s = wb.createSheet();
createTagAndData(fieldName,dataName, s,mapList);// 写表格的头部
// 创建单元格,并设置值表头 设置表头居中
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格
wb.write(oupOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}




感谢观看!







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值