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);  
					}  
    	        }  
    		 } 
    	} 
    } 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值