应用1:示例化对象、获取对象属性及属性类型
List<Object> getGetUserDatas=parseResult(userStr, GetUserData.class,false);
public static List<Object> parseResult(String xml,Class<?> t,boolean isOrder){
return parseResult(xml,t,new PageBean<Object>(),isOrder);
}
public static List<Object> parseResult(String xml,Class<?> t,PageBean<Object> pageBean,boolean isOrder) {
......
//根据传过来的Class反射生成类
Object obj=t.newInstance();
//得到类的名称
String className = t.getSimpleName();
//得到类中所有的属性
Field[] fields=t.getDeclaredFields();
String sname = fields[1].getName(); // 获取属性的名字
String sname2 = fields[2].getName(); // 获取属性的名字
//得到类的属性字段申明,返回一个 Field 对象
Field field=t.getDeclaredField(attr);
//Field.getType(),返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
//Class.getSimpleName(),返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段,如:int、double、String......
String fieldTypeName=field.getType().getSimpleName();
if(fieldTypeName.equals("int")||fieldTypeName.equalsIgnoreCase("Integer")){
field.set(obj, Integer.parseInt(value));
}else if (fieldTypeName.equalsIgnoreCase("double")) {
field.set(obj, Double.parseDouble(value));
}
......
}
说明:
Field对象:
getType()
返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
Class对象:
newInstance()
创建此 Class 对象所表示的类的一个新实例。
String getSimpleName()
返回源代码中给出的底层类的简称。
getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
应用2:Excel文件导出公共方法(根据穿过来的类设置导出内容)
/**
* @param list 查询的列表集合(转范型之后的集合)
* @param fileName 资源文件名
* @param headArray 头部数组
* @param widthArray 设置excel每列的宽度
* @param cols 显示多少列减1
* @param c 反射的类(通过它可以访问类中的属性以及方法)
* @return
* @throws Exception
*/
@SuppressWarnings("rawtypes")
public static String export(List list,String fileName,String[] headArray,int[] widthArray,int cols,Class<?> c)throws Exception{
try{
/*********创建excel阶段*********/
//创建Excel的工作书册 Workbook,对应到一个excel文档
HSSFWorkbook wb = new HSSFWorkbook();
//创建Excel的工作sheet,对应到一个excel文档的tab
HSSFSheet sheet = wb.createSheet("sheet1");
//设置excel每列宽度
for (int i = 0; i < widthArray.length; i++) {
sheet.setColumnWidth(i,widthArray[i]);
}
//创建execl第一行数句(标题)
String name=fileName+"-";
HSSFRow row = ExcelExportUtil.createTopFile(wb,sheet,cols,name + DateUtil.today() );
//创建第二行数据
row = ExcelExportUtil.createTwoRow(wb,sheet,row,headArray,1);
/***********开始写第二行已下的数据************/
int num = 2; //表示第几行
HSSFCell cell; //单元格
//样式
HSSFCellStyle styleTwo = wb.createCellStyle();
styleTwo.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//得到类中所有的属性
Field[] fields=c.getDeclaredFields();
for (Object object : list) {
row = sheet.createRow(num);
int lieNum = 0; //列号
for (int i = 0; i < fields.length; i++) {
//获取属性的名字
String sname = fields[i].getName();
//将属性的首字符大写,方便构造get,set方法
sname = sname.substring(0, 1).toUpperCase() + sname.substring(1);
System.out.println(fields[i].getGenericType()+":============================");
if(fields[i].getGenericType().toString().equals("class java.lang.String")){
//object.getClass(),返回此 Object 的运行时类
//getMethod("get" +sname) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method m = (Method) object.getClass().getMethod("get" +sname);
//对带有指定参数的指定对象调用由此 Method 对象表示的底层方法,获取值
String val = (String) m.invoke(object);
if (val != null) {
System.out.println("String type:" + val);
cell = row.createCell(lieNum++);
cell.setCellStyle(styleTwo);
cell.setCellValue(val);
}
}
//如果类型是Integer
//fields[i].getGenericType().toString() 获取属性的类型
if (fields[i].getGenericType().toString().equals("class java.lang.Integer")) {
Method m = (Method) object.getClass().getMethod("get" +sname);
Integer val = (Integer) m.invoke(object);
if (val != null) {
System.out.println("Integer type:" + val);
cell = row.createCell(lieNum++);
cell.setCellStyle(styleTwo);
cell.setCellValue(val+"");
}
}
// 如果类型是Double
if (fields[i].getGenericType().toString().equals("class java.lang.Double")) {
Method m = (Method) object.getClass().getMethod("get" + sname);
Double val = (Double) m.invoke(object);
if (val != null) {
System.out.println("Double type:" + val);
cell = row.createCell(lieNum++);
cell.setCellStyle(styleTwo);
cell.setCellValue(val+"");
}
}
// 如果类型是Boolean 是封装类
if (fields[i].getGenericType().toString().equals("class java.lang.Boolean")) {
Method m = (Method) object.getClass().getMethod(sname);
Boolean val = (Boolean) m.invoke(object);
if (val != null) {
System.out.println("Boolean type:" + val);
cell = row.createCell(lieNum++);
cell.setCellStyle(styleTwo);
cell.setCellValue(val+"");
}
}
// 如果类型是boolean 基本数据类型不一样 这里有点说名如果定义名是 isXXX的 那就全都是isXXX的
// 反射找不到getter的具体名
if (fields[i].getGenericType().toString().equals("boolean")) {
Method m = (Method) object.getClass().getMethod(sname);
Boolean val = (Boolean) m.invoke(object);
if (val != null) {
System.out.println("boolean type:" + val);
cell = row.createCell(lieNum++);
cell.setCellStyle(styleTwo);
cell.setCellValue(val+"");
}
}
// 如果类型是Short
if (fields[i].getGenericType().toString().equals("class java.lang.Short")) {
Method m = (Method) object.getClass().getMethod("get" + sname);
Short val = (Short) m.invoke(object);
if (val != null) {
System.out.println("Short type:" + val);
cell = row.createCell(lieNum++);
cell.setCellStyle(styleTwo);
cell.setCellValue(val+"");
}
}
}
num++;
}
//导出文件存放路劲
String patch= Thread.currentThread().getContextClassLoader().getResource("/").toString();
patch = patch.substring(6,patch.lastIndexOf("WEB-INF/"));
patch = patch + "produceFile/";
//文件名
String exportfileName = name + DateUtil.today() + ".xls";
FileOutputStream os = new FileOutputStream(patch + exportfileName);
wb.write(os);
os.close();
return exportfileName;
}catch(Exception e){
e.printStackTrace();
System.out.println("存储失败");
return "false";
}
}