`

反射的基本应用

阅读更多

   应用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";
	}
}

 

分享到:
评论

相关推荐

    C# 反射技术应用

    #### 二、反射基本概念 反射可以让我们在运行时获取.NET类型的所有信息,包括类、结构体、委托、接口和枚举等。通过反射,我们可以获取这些类型成员的详细信息,比如方法、属性、事件以及构造函数等,并且可以进一步...

    JAVA 反射机制应用

    1. **反射的基本概念** - 类加载:Java程序运行时,JVM会将.class文件加载到内存中,形成Class对象。 - 获取Class对象:通过Class.forName()、对象.getClass()或类名.class三种方式获取。 - 对象实例化:通过...

    .NET中反射的应用 获取Dll参数

    标题提到的".NET中反射的应用 获取Dll参数",指的是通过反射来获取DLL(动态链接库)中的类、方法、参数等元数据。这在需要动态调用DLL中的功能或者需要在不修改原有代码的情况下扩展功能时非常有用。下面将详细介绍...

    java反射机制的原理及在Android下的简单应用

    #### 一、Java反射机制的基本概念 反射(Reflection)是指程序在运行时能够访问、检测和修改它自身的能力。这种能力使得程序能够动态地获取自身的结构信息并操作自身的结构,从而达到灵活编程的目的。在计算机科学...

    反射电桥的原理和应用.zip

    反射电桥的基本原理是利用平衡和不平衡电路的转换来实现阻抗匹配。它通常由四个端口组成,其中两个端口连接待测负载,另外两个端口用于接入已知阻抗的标准件和信号源。当信号源向待测负载发送信号时,部分能量会因不...

    C#反射(Reflection)的应用

    综上所述,这个压缩包提供了一个全面的反射学习平台,涵盖了从基本原理到实际应用的多个方面。通过分析和实践这些示例,开发者将更好地掌握C#反射这一强大功能,从而在编程实践中更加灵活和高效。

    java反射基本方法测试

    下面我们将详细探讨Java反射的基本方法及其应用。 一、获取类信息 1. `Class` 类:反射的核心是`Class`类,它代表一个Java类。通过`Class`对象,我们可以获取到类的元数据。获取`Class`对象的方法有: - 使用`...

    Java反射机制经典案例

    Java反射机制是Java编程语言中的一个强大...通过以上介绍,我们了解了Java反射机制的基本概念、使用方法、应用场景以及需要注意的问题。在实际编程中,合理利用反射可以提高代码的灵活性,但同时也需注意其潜在的风险。

    MATLAB在光学界面发生反射时的分析与应用.pdf

    光学界面发生反射时,光线在不同介质之间的传播特性和反射率变化是光学领域中基本且核心的问题之一。菲涅耳公式是描述这一现象的基本理论工具,而MATLAB软件在处理这类光学计算和可视化方面展现了强大的能力。 1. ...

    xml反射基本用法........

    在本文中,我们将深入探讨XML反射的基本用法,以及如何在实际项目中应用这一技术。 首先,让我们理解什么是XML。XML(eXtensible Markup Language)是一种用于标记数据的语言,它提供了一种结构化的方式来存储和...

    反射最基本代码

    在实际应用中,Java反射通常用于实现动态代理、运行时类型检查、插件系统、元数据处理等功能。然而,由于反射操作涉及到安全性问题,并且性能相对较差,因此在不必要的情况下应避免过度使用反射。

    java反射应用实例

    1. **什么是反射**:首先,我们需要理解反射的基本概念。反射是Java提供的一种能力,可以在运行时动态获取类的信息(如类名、属性、方法等)并调用这些元素。它允许我们编写更加灵活和通用的代码。 2. **Class对象*...

    matlab计算反射阵单元相位(460652)_matlab反射阵相位_matlab反射阵_反射阵matlab_反射阵

    首先,我们要了解反射阵的基本原理。反射阵是由多个天线单元组成的阵列,每个单元可以独立地调整相位,以实现特定的方向性或波束形状。这种调整相位的能力使得反射阵能够集中能量在某一特定方向,从而提高信号的定向...

    Java方法反射调用demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...

    java反射-英文版反射规范

    ### Java反射机制详解 #### 一、概述 ...通过以上介绍,我们不仅深入了解了Java反射的基本概念和应用场景,还学习了如何利用反射来处理各种类型的数据结构。这对于深入理解和应用Java语言具有重要意义。

    反射的概念及应用(C#)

    反射是.NET框架中的一种强大机制...在学习和使用C#反射技术时,确保理解其基本原理和常见应用场景,同时注意控制反射的使用,以保持代码的效率和可维护性。通过熟练掌握反射,开发者可以构建更加灵活和强大的应用程序。

    通过反射和aidl获取应用大小

    1. 获取安装包基本信息:首先,我们需要获取到`PackageInfo`对象,它包含了应用的基本信息,如包名、版本号等。可以通过`PackageManager`的`getPackageInfo()`方法实现,传入应用的包名和`PackageManager.GET_...

    反射实例-JAVA反射机制

    **反射的基本特征:** - **自我描述(Self-Representation)**:程序能够描述自己的结构和行为。 - **自我监控(Examination)**:程序能够观察自己运行时的状态。 - **自我修改(Modification)**:程序能够在运行...

Global site tag (gtag.js) - Google Analytics