程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> java反射,ReflectUtils,javareflectutils

java反射,ReflectUtils,javareflectutils

編輯:JAVA綜合教程

java反射,ReflectUtils,javareflectutils


  1 public class ReflectUtils {
  2     /** 
  3      * 通過構造函數實例化對象  
  4      * @param className       類的全路徑名稱    
  5      * @param parameterTypes  參數類型 
  6      * @param initargs        參數值 
  7      * @return 
  8      */    
  9     @SuppressWarnings("rawtypes")  
 10     public static Object constructorNewInstance(String className,Class [] parameterTypes,Object[] initargs) {   
 11         try {  
 12             Constructor<?> constructor = (Constructor<?>) Class  
 13                     .forName(className).getDeclaredConstructor(parameterTypes);                    
 14             constructor.setAccessible(true);  
 15             return constructor.newInstance(initargs);  
 16         } catch (Exception ex) {  
 17             throw new RuntimeException();  
 18         }  
 19   
 20     }  
 21   
 22       
 23     /** 
 24      * 獲取字段值 
 25      * @param propertyName 屬性名 
 26      * @param object       實例對象 
 27      * @return          字段值 
 28      */  
 29     public static Object getProperty(String propertyName, Object object) {  
 30         try {  
 31               
 32             PropertyDescriptor pd = new PropertyDescriptor(propertyName,object.getClass());  
 33             Method method = pd.getReadMethod();  
 34             return method.invoke(object);  
 35         } catch (Exception ex) {  
 36             throw new RuntimeException();  
 37         }  
 38     }  
 39       
 40     /** 
 41      * 通過BeanUtils工具包獲取反射獲取字段值,注意此值是以字符串形式存在的,它支持屬性連綴操作:如,.對象.屬性 
 42      * @param propertyName 屬性名 
 43      * @param object       實例對象 
 44      * @return          字段值 
 45      */    
 46     public static Object getBeanInfoProperty(String propertyName, Object object) {  
 47         try {             
 48             return BeanUtils.getProperty(object, propertyName);  
 49         } catch (Exception ex) {  
 50             throw new RuntimeException();  
 51         }  
 52     }  
 53       
 54     /** 
 55      * 通過BeanUtils工具包獲取反射獲取字段值,注意此值是以字符串形式存在的 
 56      * @param object       實例對象 
 57      * @param propertyName 屬性名 
 58      * @param value        字段值 
 59      * @return           
 60      */    
 61     public static void setBeanInfoProperty(Object object,String propertyName,String value) {  
 62         try {             
 63             BeanUtils.setProperty(object, propertyName,value);  
 64         } catch (Exception ex) {  
 65             throw new RuntimeException();  
 66         }  
 67     }  
 68       
 69     /** 
 70      * 通過BeanUtils工具包獲取反射獲取字段值,注意此值是以對象屬性的實際類型 
 71      * @param propertyName 屬性名 
 72      * @param object       實例對象 
 73      * @return          字段值 
 74      */   
 75     public static Object getPropertyUtilByName(String propertyName, Object object) {  
 76         try {             
 77             return PropertyUtils.getProperty(object, propertyName);  
 78         } catch (Exception ex) {  
 79             throw new RuntimeException();  
 80         }  
 81     }  
 82       
 83     /** 
 84      * 通過BeanUtils工具包獲取反射獲取字段值,注意此值是以對象屬性的實際類型,這是PropertyUtils與BeanUtils的根本區別 
 85      * @param object       實例對象 
 86      * @param propertyName 屬性名 
 87      * @param value        字段值 
 88      * @return           
 89      */   
 90     public static void setPropertyUtilByName(Object object,String propertyName,Object value) {  
 91         try {             
 92             PropertyUtils.setProperty(object, propertyName,value);  
 93         } catch (Exception ex) {  
 94             throw new RuntimeException();  
 95         }  
 96     }  
 97       
 98     /** 
 99      * 設置字段值     
100      * @param obj          實例對象 
101      * @param propertyName 屬性名 
102      * @param value        新的字段值 
103      * @return           
104      */ 
105     public static void setProperties(Object object, String propertyName,Object value) throws IntrospectionException,  
106             IllegalAccessException, InvocationTargetException {  
107         PropertyDescriptor pd = new PropertyDescriptor(propertyName,object.getClass());  
108         Method methodSet = pd.getWriteMethod();  
109         methodSet.invoke(object,value);  
110     }  
111       
112       
113     /** 
114      * 設置字段值 
115      * @param className        類的全路徑名稱 
116      * @param methodName       調用方法名 
117      * @param parameterTypes   參數類型 
118      * @param values           參數值 
119      * @param object           實例對象 
120      * @return           
121      */  
122     @SuppressWarnings("rawtypes")  
123     public static Object methodInvoke(String className,String methodName,Class [] parameterTypes,Object [] values,Object object) {  
124         try {  
125             Method method = Class.forName(className).getDeclaredMethod(methodName,parameterTypes);  
126             method.setAccessible(true);  
127             return method.invoke(object,values);  
128         } catch (Exception ex) {  
129             throw new RuntimeException();  
130         }  
131     }    
132   
133     /** 
134      * @param <T> 具體對象 
135      * @param fileds  要進行比較Bean對象的屬性值集合(以屬性值為key,屬性注釋為value,集合從數據庫中取出) 
136      * @param oldBean  源對象 
137      * @param newBean  新對象 
138      * @return 返回二個Bean對象屬性值的異同 
139      */  
140     @SuppressWarnings("unused")
141     public static <T> String compareBeanValue(Map<String,String> fileds,T oldBean,T newBean){  
142           
143         StringBuilder compares = new StringBuilder();  
144         String propertyName = null;       
145         Object oldPropertyValue = null;  
146         Object newPropertyValue = null;  
147           
148         StringBuilder descrips = new StringBuilder();                 
149         for(Map.Entry<String, String> entity : fileds.entrySet()){  
150             propertyName = entity.getKey().toLowerCase();  
151             oldPropertyValue = getProperty(propertyName, oldBean);  
152             newPropertyValue = getProperty(propertyName, newBean);            
153                               
154             if(null == oldPropertyValue && null == newPropertyValue){  
155                 continue;  
156             }             
157             if("".equals(oldPropertyValue) && "".equals(newPropertyValue)){  
158                 continue;  
159             }             
160             if(null == oldPropertyValue){  
161                 oldPropertyValue = "";  
162             }             
163             if(null == newPropertyValue){  
164                 newPropertyValue = "";  
165             }             
166               
167             if(oldPropertyValue.equals(newPropertyValue)){            
168                 continue;  
169             }  
170             compares.append("字段注釋: ").append(entity.getValue()).append("】").append("原屬性值\"");  
171             if(StringUtils.isEmpty(oldPropertyValue+"")){  
172                 oldPropertyValue = " ";  
173             }  
174             compares.append(oldPropertyValue).append("\"現屬性值\"");  
175             if(StringUtils.isEmpty(newPropertyValue+"")){  
176                 newPropertyValue = " ";  
177             }  
178             compares.append(newPropertyValue).append("\";");              
179         }         
180         return compares.toString();  
181     }
182  
183     
184     /*** 
185      * 暴力反射獲取字段值 
186      * @param obj       實例對象 
187      * @param fieldName 屬性名 
188      * @return          屬性值 
189      */
190     public static Object getFieldValue(Object obj, String fieldName){
191         if(obj == null){  
192             return null ;  
193         }    
194         Field targetField = getTargetField(obj.getClass(), fieldName);  
195           
196         try {  
197             return FieldUtils.readField(targetField, obj, true ) ;  
198         } catch (IllegalAccessException e) {  
199             e.printStackTrace();  
200         }   
201         return null ;
202     }
203     
204     public static Field getTargetField(Class<?> targetClass, String fieldName) {  
205         Field field = null;  
206   
207         try {  
208             if (targetClass == null) {  
209                 return field;  
210             }  
211   
212             if (Object.class.equals(targetClass)) {  
213                 return field;  
214             }  
215   
216             field = FieldUtils.getDeclaredField(targetClass, fieldName, true);  
217             if (field == null) {  
218                 field = getTargetField(targetClass.getSuperclass(), fieldName);  
219             }  
220         } catch (Exception e) {  
221         }  
222   
223         return field;  
224     }
225     
226     /** 
227      * 設置字段值 
228      * @param propertyName 字段名 
229      * @param obj          實例對象 
230      * @param value        新的字段值 
231      * @return           
232      */
233     public static void setFieldValue(Object obj , String fieldName , Object value ){  
234         if(null == obj){return;}  
235         Field targetField = getTargetField(obj.getClass(), fieldName);    
236         try {  
237              FieldUtils.writeField(targetField, obj, value) ;  
238         } catch (IllegalAccessException e) {  
239             e.printStackTrace();  
240         }   
241     }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved