对象工具类 - ObjectUtils.java

对象工具类,提供对象克隆、获取对象属性、类型判断、Map转换对象、对象转Map、设置对象属性等。


源码如下:(点击下载 -  ObjectUtils.java 、JsonUtils.java 、gson-2.2.4.jar 、commons-lang-2.6.jar)

  1 import java.io.Serializable;
  2 import java.lang.reflect.Field;
  3 import java.lang.reflect.Method;
  4 import java.util.Map;
  5 import org.apache.commons.lang.SerializationUtils;
  6 import org.apache.commons.lang.StringUtils;
  7 
  8 /**
  9  * 对象工具类
 10  * 
 11  */
 12 public class ObjectUtils {
 13 
 14     private static final Class<?>[] BASIC_NUMBER_CLASSES = new Class[] {
 15             short.class, int.class, long.class, float.class, double.class };
 16 
 17     /**
 18      * 对象克隆
 19      *
 20      * @param t
 21      *            a T object.
 22      * @param <T>
 23      *            a T object.
 24      * @return a T object.
 25      */
 26     @SuppressWarnings("unchecked")
 27     public static final <T> T clone(T t) {
 28         if (t == null) {
 29             return null;
 30         }
 31         if (t instanceof Serializable) {
 32             return (T) SerializationUtils.clone((Serializable) t);
 33         }
 34         T result = null;
 35         if (t instanceof Cloneable) {
 36             try {
 37                 result = (T) ObjectUtils.clone(t);
 38             } catch (Throwable e) {
 39             }
 40         }
 41         if (result == null) {
 42             String json = JsonUtils.toJson(t);
 43             result = (T) JsonUtils.fromJson(json, t.getClass());
 44         }
 45         return result;
 46     }
 47 
 48     /**
 49      * 访问对象成员属性值值
 50      * 
 51      * @param obj
 52      * @param field
 53      * @return
 54      * @throws YichaException
 55      */
 56     @SuppressWarnings("rawtypes")
 57     private static final Object getFieldValue(Object obj, String field) throws Exception {
 58         Object result = null;
 59         if (obj instanceof Map) {
 60             return ((Map) obj).get(field);
 61         }
 62 
 63         if (obj == null) {
 64             return null;
 65         }
 66 
 67         Method getterMethod = null;
 68         try {
 69             getterMethod = obj.getClass().getMethod("get" + StringUtils.capitalize(field));
 70         } catch (Exception e) {
 71         }
 72         if (getterMethod == null) {
 73             try {
 74                 getterMethod = obj.getClass().getMethod("is" + StringUtils.capitalize(field));
 75             } catch (Exception e) {
 76             }
 77         }
 78         if (getterMethod == null) {
 79             Field privateField;
 80             try {
 81                 privateField = obj.getClass().getDeclaredField(field);
 82                 privateField.setAccessible(true);
 83                 result = privateField.get(obj);
 84             } catch (Exception e) {
 85                 throw new Exception("field[" + field + "] doesn't exist.");
 86             }
 87         } else {
 88             try {
 89                 result = getterMethod.invoke(obj);
 90             } catch (Exception e) {
 91             }
 92         }
 93         return result;
 94     }
 95 
 96     /**
 97      * 获取对象属性值
 98      *
 99      * @param obj
100      *            被取值的对象
101      * @param clazz
102      *            返回值的类型
103      * @param path
104      *            格式:field1.field2.field3
105      * @param <T>
106      *            a T object.
107      * @return a T object.
108      */
109     @SuppressWarnings("unchecked")
110     public static final <T> T getValue(Object obj, Class<T> clazz, String path) {
111         Object o = getValue(obj, path);
112         return o == null ? null : (T) o;
113     }
114 
115     /**
116      * <p>
117      * getValue.
118      * </p>
119      *
120      * @param obj
121      *            a {@link java.lang.Object} object.
122      * @param path
123      *            a {@link java.lang.String} object.
124      * @return a {@link java.lang.Object} object.
125      */
126     public static final Object getValue(Object obj, String path) {
127         if (obj == null || StringUtils.isBlank(path)) {
128             return null;
129         }
130         String[] arr = StringUtils.split(path, ".");
131         Object o = obj;
132         for (int i = 0, len = arr.length; i < len; i++) {
133             final String field = StringUtils.strip(arr[i]);
134             try {
135                 o = getFieldValue(o, field);
136             } catch (Exception e) {
137                 o = null;
138             }
139         }
140         return o;
141     }
142 
143     /**
144      * 判断是否是数字类型
145      *
146      * @param obj
147      *            a {@link java.lang.Object} object.
148      * @return a boolean.
149      */
150     public static final boolean isNumberType(Object obj) {
151         if (obj == null) {
152             throw new RuntimeException("object is null.");
153         }
154         if (obj instanceof Number) {
155             return true;
156         } else {
157             for (Class<?> clazz : BASIC_NUMBER_CLASSES) {
158                 if (obj.getClass().equals(clazz)) {
159                     return true;
160                 }
161             }
162         }
163         return false;
164     }
165 
166     /**
167      * 判断对象是否为零
168      *
169      * @param obj
170      *            a {@link java.lang.Object} object.
171      * @return a boolean.
172      */
173     public static final boolean isZero(Object obj) {
174         if (!isNumberType(obj)) {
175             return false;
176         }
177         final String foo = String.valueOf(obj);
178         return StringUtils.equals(foo, "0") || StringUtils.equals(foo, "0.0");
179     }
180 
181     /**
182      * Map转换对象
183      *
184      * @param map
185      *            a {@link java.util.Map} object.
186      * @param clazz
187      *            a {@link java.lang.Class} object.
188      * @param <T>
189      *            a T object.
190      * @return a T object.
191      */
192     public static final <T> T fromMap(final Map<String, Object> map, Class<T> clazz) {
193         return JsonUtils.fromJson(JsonUtils.toJson(map), clazz);
194     }
195 
196     /**
197      * 对象转Map
198      *
199      * @param object
200      *            a {@link java.lang.Object} object.
201      * @return a {@link java.util.Map} object.
202      */
203     public static final Map<String, Object> toMap(final Object object) {
204         return JsonUtils.fromJson(JsonUtils.toJson(object));
205     }
206 
207     /**
208      * 设置对象属性
209      *
210      * @param object
211      *            a {@link java.lang.Object} object.
212      * @param field
213      *            a {@link java.lang.String} object.
214      * @param value
215      *            a T object.
216      * @param paramType
217      *            a {@link java.lang.Class} object.
218      * @param <T>
219      *            a T object.
220      */
221     @SuppressWarnings("rawtypes")
222     public static final <T> void setValue(final Object object, final String field, final T value, final Class paramType) {
223         try {
224             Method md = object.getClass().getMethod("set" + StringUtils.capitalize(field), paramType);
225             if (md != null) {
226                 md.invoke(object, value);
227             }
228         } catch (Throwable e) {
229             throw new RuntimeException(e);
230         }
231     }
232 
233     /**
234      * 设置对象属性
235      *
236      * @param object
237      *            a {@link java.lang.Object} object.
238      * @param field
239      *            a {@link java.lang.String} object.
240      * @param value
241      *            a T object.
242      * @param <T>
243      *            a T object.
244      */
245     public static final <T> void setValue(final Object object, final String field, final T value) {
246         try {
247             for (Method method : object.getClass().getMethods()) {
248                 if (StringUtils.equals(method.getName(), "set" + StringUtils.capitalize(field))) {
249                     method.invoke(object, value);
250                     break;
251                 }
252             }
253         } catch (Throwable e) {
254             throw new RuntimeException(e);
255         }
256     }
257 
258 }

 

posted @ 2016-02-19 12:31  小周JAVA技术分享  阅读(9891)  评论(0编辑  收藏  举报