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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章