`

java反射机制的两个应用

 
阅读更多

为了解决某个问题,需要把对象的非基本数据类型,如自定义的一些类型,如在我的包:com.shutao.test下面的,和一些java.util.Set类型的设置为NULL,这里写了个通用类,包括调用自己的和父类的setter方法,大家可参考参考:

	    /**
	     * 调用对象的setter方法,将非基本数据类型统一设置为null值
	     * @author linshutao
	     * */
	    public static void setFieldToNull(Object o) {
	    	//获取自己的属性
	    	Field[] fields1=o.getClass().getDeclaredFields();
	    	//获得父类的属性
	    	Field[] fields2=o.getClass().getSuperclass().getDeclaredFields();
	    	//合并所有属性
	    	Field[] fields = new Field[fields1.length+fields2.length];
	    	for(int i=0;i<fields1.length;++i){
	    		fields[i] = fields1[i];
	    	}
	    	for(int j=0;j<fields2.length;++j){
	    		fields[fields1.length+j] = fields2[j];
	    	}
	    	for(int i=0;i<fields.length;i++){
	    		 String fieldName = fields[i].getName();  //属性名称
	    		 String filedType = fields[i].getType().toString(); //属性类型
	    		//去掉前面的class啊inteface啊这些说明
	    		 filedType = filedType.substring(filedType.indexOf(" ")+1);
	    		//如果是我自定义的类型的
	    		 if(filedType.indexOf("com.shutao.test")!=-1 ||
	    				 filedType.indexOf("Set")!=-1){		
	 	            String firstLetter = fieldName.substring(0, 1).toUpperCase(); 
	 	            //得到方法名称
	 	            String setter = "set" + firstLetter + fieldName.substring(1);  
	    	        try {
	    	        	//先调用自身的方法
	    	        	Method callMethod = o.getClass().getMethod(setter, Class.forName(filedType)); 
						callMethod.invoke(o, new Object[] {null});
	    	        } catch (Exception e) {   	        	
	     	            try {
	     	            	//上面调用自身的方法如果调不到会抛异常,这里再调用父类的方法
	        	            Method callMethod = o.getClass().getSuperclass().getDeclaredMethod(setter,Class.forName(filedType));
	        	            callMethod.invoke(o, new Object[] {null});
						} catch (Exception e1) {
							log.error(e1.getMessage(),e1);  
						}  
	    	        }  
	    		 } 
	    	} 
	    }


另外有个地方为了避免set集合因lazy=true而引起的懒加载异常,需要统一进行实例话,与是写了下面这个方法:

    /**
     * 调用对象的Set类型的getter方法,可用于实例化集合,避免hibernate的lazy引起的异常
     * @author linshutao
     * */
    public static void callGetMethodForSetField(Object o) {
    	Field[] fields = getFieldsIncludeParent(o);
    	for(int i=0;i<fields.length;i++){
    		 String fieldName = fields[i].getName();  //属性名称
    		 String filedType = fields[i].getType().toString(); //属性类型
    		//去掉前面的class啊inteface啊这些说明
    		 filedType = filedType.substring(filedType.indexOf(" ")+1);
    		//如果是Set类型的
    		 if(filedType.indexOf("Set")!=-1){			
 	            String firstLetter = fieldName.substring(0, 1).toUpperCase(); 
 	            //得到方法名称
 	            String method = "get" + firstLetter + fieldName.substring(1);  
    	        try {
    	        	//先调用自身的方法
    	        	Method callMethod = o.getClass().getMethod(method, new Class[] {}); 
					//调用set的size用于实例化
    	        	Set set = (Set)callMethod.invoke(o, new Object[] {});
					set.size();
    	        } catch (Exception e) {   	        	
     	            try {
     	            	//上面调用自身的方法如果调不到会抛异常,这里再调用父类的方法
        	            Method callMethod = o.getClass().getSuperclass().getDeclaredMethod(method,new Class[] {});
        	            Set set = (Set) callMethod.invoke(o, new Object[] {});
        	            set.size();
					} catch (Exception e1) {
						log.error(e1.getMessage(),e1);  
					}  
    	        }  
    		 } 
    	} 
    } 




分享到:
评论

相关推荐

    java泛型和反射机制

    对java泛型以及反射机制进行原理和应用上的讲解,帮助初学者对这两个概念进行更轻松的掌握

    Java 学习之反射机制及应用场景

    前言:  近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,...  JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方

    JAVA新特性--java反射、映射

    其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。最近,反射机制也被应用到了视窗系统、操作系统和文件系统中。 反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管...

    手写IOC项目,学习理解Spring IOC原理

    Java反射机制是在运行状态中,对于任意类,都能够知道这个类的属性和方法;对于任何一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象的方式称为Java语言的反射机制。简单来说,反射机制指...

    Java开发技术大全(500个源代码).

    outputMax.java 求两个数中的最大数 overflowExample.java 演示溢出 precedence.java 演示自加运算符的优先级 primeNumber.java 输出100-200之间的所有素数 ranking.java 评定成绩等级 rankingBySwitch.java ...

    JAVA_API1.6文档(中文)

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    牛客网BAT算法精品课练习题答案,包括JAVA和C++两个版本,代码中附上大量注释帮助理解程序.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    Java 1.6 API 中文 New

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    java api最新7.0

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    JavaAPI1.6中文chm文档 part1

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    Java - Spring-IoC(Inverse of Control)–> 控制反转

    一、Spring简介 1. 概述 ...工厂模式 + 反射机制:工厂模式提供创建方法,通过反射获取需要加载的类的全限定名称,通过工厂加载产生需要的类对象。 ② AoP(Aspect Oriented Programing) --&gt; 面向切面编程

    实验项目D、Java应用专题编程

    1、完成“6.5.1枚举基础和应用”中【3、星期枚举类——能给出“星期几”和“周几”的版本】的两个空。 ⑴答:zhou="周"+xq.charAt(2); ⑵答:weeks.getzhou() 2、结合实验专题6的“6.5.6泛型基础”中【1、泛型与集合...

    JavaAPI中文chm文档 part2

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    java jdk-api-1.6 中文 chmd

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    java必了解的六大问题

    *第八阶段:JavaScript脚本语言,包括javaScript语法和对象,就这两个方面的内容; *第九阶段:DOM编程,包括DOM原理,常用的DOM元素以及比较重要的DOM编程思想; *第十阶段:Servlet开发,从此开始踏入java...

    java基础案例与开发详解案例源码全

    15.2 使用Java反射机制414 15.2.1 获取类型信息414 15.2.2 创建对象417 15.2.3 调用方法419 15.2.4 访问成员变量的值421 15.2.5 操作数组422 15.3 反射与动态代理424 15.3.1 静态代理424 15.3.2 动态代理426 15.4 本...

    底层的技术-----反射技术

    反射机制可认为是用来描述一组类--------可以与File对比着学习 反射的实际应用: String----类---实例化成对象 设计一个方法,给一个字符串(类)返回一个对象,对象里面还有属性值 例如考试系统中 Question类型 ...

    JAVA面试题最全集

    ActiveX数据对象,是一个应用级程序接口. 75.四种JDBC方式?目前的版本? 76.EJB有哪几种?区别是什么? 77.JavaBean与EJB有什么区别? 78.软件开发生命周期有哪几个阶段? 79.软件开发有哪些因素? 80.软件开发中如何...

Global site tag (gtag.js) - Google Analytics