Commit 104ddd44db51e300e5763037a05360fc406c2376
1 parent
b85e10e2fc
Exists in
master
and in
6 other branches
排除掉常量那些字段
Showing 1 changed file with 291 additions and 294 deletions
platform-common/src/main/java/com/lyms/platform/common/utils/ReflectionUtils.java
View file @
104ddd4
| ... | ... | @@ -3,11 +3,7 @@ |
| 3 | 3 | import java.beans.BeanInfo; |
| 4 | 4 | import java.beans.Introspector; |
| 5 | 5 | import java.beans.PropertyDescriptor; |
| 6 | -import java.lang.reflect.Field; | |
| 7 | -import java.lang.reflect.InvocationTargetException; | |
| 8 | -import java.lang.reflect.Method; | |
| 9 | -import java.lang.reflect.ParameterizedType; | |
| 10 | -import java.lang.reflect.Type; | |
| 6 | +import java.lang.reflect.*; | |
| 11 | 7 | import java.util.HashMap; |
| 12 | 8 | import java.util.Iterator; |
| 13 | 9 | import java.util.Map; |
| 14 | 10 | |
| 15 | 11 | |
| 16 | 12 | |
| 17 | 13 | |
| 18 | 14 | |
| 19 | 15 | |
| 20 | 16 | |
| 21 | 17 | |
| 22 | 18 | |
| ... | ... | @@ -22,56 +18,55 @@ |
| 22 | 18 | |
| 23 | 19 | /** |
| 24 | 20 | * 反射工具类. |
| 25 | - * | |
| 21 | + * <p/> | |
| 26 | 22 | * 提供访问私有变量,获取泛型类型Class, 提取集合中元素的属性, 转换字符串到对象等Util函数. |
| 27 | - * | |
| 28 | 23 | */ |
| 29 | 24 | public class ReflectionUtils { |
| 30 | 25 | |
| 31 | - private static Logger logger = LoggerFactory | |
| 32 | - .getLogger(ReflectionUtils.class); | |
| 26 | + private static Logger logger = LoggerFactory | |
| 27 | + .getLogger(ReflectionUtils.class); | |
| 33 | 28 | |
| 34 | - private static final ConcurrentHashMap<Class<?>, Class<?>> classInstance = new ConcurrentHashMap<Class<?>, Class<?>> (); | |
| 29 | + private static final ConcurrentHashMap<Class<?>, Class<?>> classInstance = new ConcurrentHashMap<Class<?>, Class<?>>(); | |
| 35 | 30 | |
| 36 | - /** | |
| 37 | - * 调用Getter方法. | |
| 38 | - */ | |
| 39 | - public static Object invokeGetterMethod(Object obj, String propertyName) { | |
| 40 | - String getterMethodName = "get" + StringUtils.capitalize(propertyName); | |
| 41 | - return invokeMethod(obj, getterMethodName, new Class[] {}, | |
| 42 | - new Object[] {}); | |
| 43 | - } | |
| 31 | + /** | |
| 32 | + * 调用Getter方法. | |
| 33 | + */ | |
| 34 | + public static Object invokeGetterMethod(Object obj, String propertyName) { | |
| 35 | + String getterMethodName = "get" + StringUtils.capitalize(propertyName); | |
| 36 | + return invokeMethod(obj, getterMethodName, new Class[]{}, | |
| 37 | + new Object[]{}); | |
| 38 | + } | |
| 44 | 39 | |
| 45 | - public static Map<String, Object> beanToMap(Object obj) { | |
| 46 | - if(obj == null){ | |
| 47 | - return null; | |
| 48 | - } | |
| 49 | - Map<String, Object> map = new HashMap<String, Object>(); | |
| 50 | - try { | |
| 51 | - BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); | |
| 52 | - PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); | |
| 53 | - for (PropertyDescriptor property : propertyDescriptors) { | |
| 54 | - String key = property.getName(); | |
| 55 | - // 过滤class属性 | |
| 56 | - if (!key.equals("class")) { | |
| 57 | - // 得到property对应的getter方法 | |
| 58 | - Method getter = property.getReadMethod(); | |
| 59 | - Object value = getter.invoke(obj); | |
| 40 | + public static Map<String, Object> beanToMap(Object obj) { | |
| 41 | + if (obj == null) { | |
| 42 | + return null; | |
| 43 | + } | |
| 44 | + Map<String, Object> map = new HashMap<String, Object>(); | |
| 45 | + try { | |
| 46 | + BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); | |
| 47 | + PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); | |
| 48 | + for (PropertyDescriptor property : propertyDescriptors) { | |
| 49 | + String key = property.getName(); | |
| 50 | + // 过滤class属性 | |
| 51 | + if (!key.equals("class")) { | |
| 52 | + // 得到property对应的getter方法 | |
| 53 | + Method getter = property.getReadMethod(); | |
| 54 | + Object value = getter.invoke(obj); | |
| 60 | 55 | |
| 61 | - map.put(key, value); | |
| 62 | - } | |
| 63 | - } | |
| 64 | - } catch (Exception e) { | |
| 65 | - e.printStackTrace(); | |
| 66 | - } | |
| 67 | - return map; | |
| 56 | + map.put(key, value); | |
| 57 | + } | |
| 58 | + } | |
| 59 | + } catch (Exception e) { | |
| 60 | + e.printStackTrace(); | |
| 61 | + } | |
| 62 | + return map; | |
| 68 | 63 | |
| 69 | - } | |
| 64 | + } | |
| 70 | 65 | |
| 71 | - public static Map<String, String> beanToStrMap(Object obj) { | |
| 66 | + public static Map<String, String> beanToStrMap(Object obj) { | |
| 72 | 67 | Map<String, Object> map = beanToMap(obj); |
| 73 | 68 | Map<String, String> restMap = new HashMap<>(); |
| 74 | - if(MapUtils.isNotEmpty(map)) { | |
| 69 | + if (MapUtils.isNotEmpty(map)) { | |
| 75 | 70 | Set<Map.Entry<String, Object>> entries = map.entrySet(); |
| 76 | 71 | Iterator<Map.Entry<String, Object>> iterator = entries.iterator(); |
| 77 | 72 | while (iterator.hasNext()) { |
| 78 | 73 | |
| 79 | 74 | |
| 80 | 75 | |
| 81 | 76 | |
| 82 | 77 | |
| 83 | 78 | |
| 84 | 79 | |
| 85 | 80 | |
| 86 | 81 | |
| 87 | 82 | |
| 88 | 83 | |
| 89 | 84 | |
| 90 | 85 | |
| 91 | 86 | |
| 92 | 87 | |
| 93 | 88 | |
| 94 | 89 | |
| 95 | 90 | |
| 96 | 91 | |
| 97 | 92 | |
| 98 | 93 | |
| 99 | 94 | |
| 100 | 95 | |
| 101 | 96 | |
| 102 | 97 | |
| ... | ... | @@ -81,250 +76,252 @@ |
| 81 | 76 | } |
| 82 | 77 | return restMap; |
| 83 | 78 | |
| 84 | - } | |
| 79 | + } | |
| 85 | 80 | |
| 86 | - /** | |
| 87 | - * 调用Setter方法.使用value的Class来查找Setter方法. | |
| 88 | - */ | |
| 89 | - public static void invokeSetterMethod(Object obj, String propertyName, | |
| 90 | - Object value) { | |
| 91 | - invokeSetterMethod(obj, propertyName, value, null); | |
| 92 | - } | |
| 81 | + /** | |
| 82 | + * 调用Setter方法.使用value的Class来查找Setter方法. | |
| 83 | + */ | |
| 84 | + public static void invokeSetterMethod(Object obj, String propertyName, | |
| 85 | + Object value) { | |
| 86 | + invokeSetterMethod(obj, propertyName, value, null); | |
| 87 | + } | |
| 93 | 88 | |
| 94 | - /** | |
| 95 | - * 调用Setter方法. | |
| 96 | - * | |
| 97 | - * @param propertyType | |
| 98 | - * 用于查找Setter方法,为空时使用value的Class替代. | |
| 99 | - */ | |
| 100 | - public static void invokeSetterMethod(Object obj, String propertyName, | |
| 101 | - Object value, Class<?> propertyType) { | |
| 102 | - Class<?> type = propertyType != null ? propertyType : value.getClass(); | |
| 103 | - String setterMethodName = "set" + StringUtils.capitalize(propertyName); | |
| 104 | - invokeMethod(obj, setterMethodName, new Class[] { type }, | |
| 105 | - new Object[] { value }); | |
| 106 | - } | |
| 89 | + /** | |
| 90 | + * 调用Setter方法. | |
| 91 | + * | |
| 92 | + * @param propertyType 用于查找Setter方法,为空时使用value的Class替代. | |
| 93 | + */ | |
| 94 | + public static void invokeSetterMethod(Object obj, String propertyName, | |
| 95 | + Object value, Class<?> propertyType) { | |
| 96 | + Class<?> type = propertyType != null ? propertyType : value.getClass(); | |
| 97 | + String setterMethodName = "set" + StringUtils.capitalize(propertyName); | |
| 98 | + invokeMethod(obj, setterMethodName, new Class[]{type}, | |
| 99 | + new Object[]{value}); | |
| 100 | + } | |
| 107 | 101 | |
| 108 | - /** | |
| 109 | - * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. | |
| 110 | - */ | |
| 111 | - public static Object getFieldValue(final Object obj, final String fieldName) { | |
| 112 | - Field field = getAccessibleField(obj, fieldName); | |
| 102 | + /** | |
| 103 | + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. | |
| 104 | + */ | |
| 105 | + public static Object getFieldValue(final Object obj, final String fieldName) { | |
| 106 | + Field field = getAccessibleField(obj, fieldName); | |
| 113 | 107 | |
| 114 | - if (field == null) { | |
| 115 | - throw new IllegalArgumentException("Could not find field [" | |
| 116 | - + fieldName + "] on target [" + obj + "]"); | |
| 117 | - } | |
| 108 | + if (field == null) { | |
| 109 | + throw new IllegalArgumentException("Could not find field [" | |
| 110 | + + fieldName + "] on target [" + obj + "]"); | |
| 111 | + } | |
| 118 | 112 | |
| 119 | - Object result = null; | |
| 120 | - try { | |
| 121 | - result = field.get(obj); | |
| 122 | - } catch (IllegalAccessException e) { | |
| 123 | - logger.error("不可能抛出的异常{}", e.getMessage()); | |
| 124 | - } | |
| 125 | - return result; | |
| 126 | - } | |
| 113 | + Object result = null; | |
| 114 | + try { | |
| 115 | + result = field.get(obj); | |
| 116 | + } catch (IllegalAccessException e) { | |
| 117 | + logger.error("不可能抛出的异常{}", e.getMessage()); | |
| 118 | + } | |
| 119 | + return result; | |
| 120 | + } | |
| 127 | 121 | |
| 128 | - /** | |
| 129 | - * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. | |
| 130 | - */ | |
| 131 | - public static void setFieldValue(final Object obj, final String fieldName, | |
| 132 | - final Object value) { | |
| 133 | - Field field = getAccessibleField(obj, fieldName); | |
| 122 | + /** | |
| 123 | + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. | |
| 124 | + */ | |
| 125 | + public static void setFieldValue(final Object obj, final String fieldName, | |
| 126 | + final Object value) { | |
| 127 | + Field field = getAccessibleField(obj, fieldName); | |
| 134 | 128 | |
| 135 | - if (field == null) { | |
| 136 | - throw new IllegalArgumentException("Could not find field [" | |
| 137 | - + fieldName + "] on target [" + obj + "]"); | |
| 138 | - } | |
| 129 | + if (field == null) { | |
| 130 | + throw new IllegalArgumentException("Could not find field [" | |
| 131 | + + fieldName + "] on target [" + obj + "]"); | |
| 132 | + } | |
| 139 | 133 | |
| 140 | - try { | |
| 141 | - field.set(obj, value); | |
| 142 | - } catch (IllegalAccessException e) { | |
| 143 | - logger.error("不可能抛出的异常:{}", e.getMessage()); | |
| 144 | - } | |
| 145 | - } | |
| 134 | + try { | |
| 135 | + field.set(obj, value); | |
| 136 | + } catch (IllegalAccessException e) { | |
| 137 | + logger.error("不可能抛出的异常:{}", e.getMessage()); | |
| 138 | + } | |
| 139 | + } | |
| 146 | 140 | |
| 147 | - /** | |
| 148 | - * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. | |
| 149 | - * | |
| 150 | - * 如向上转型到Object仍无法找到, 返回null. | |
| 151 | - */ | |
| 152 | - public static Field getAccessibleField(final Object obj, | |
| 153 | - final String fieldName) { | |
| 154 | - Assert.notNull(obj, "object不能为空"); | |
| 155 | - Assert.hasText(fieldName, "fieldName"); | |
| 156 | - for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass | |
| 157 | - .getSuperclass()) { | |
| 158 | - try { | |
| 159 | - Field field = superClass.getDeclaredField(fieldName); | |
| 160 | - field.setAccessible(true); | |
| 161 | - return field; | |
| 162 | - } catch (NoSuchFieldException e) {// NOSONAR | |
| 163 | - // Field不在当前类定义,继续向上转型 | |
| 164 | - } | |
| 165 | - } | |
| 166 | - return null; | |
| 167 | - } | |
| 141 | + /** | |
| 142 | + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. | |
| 143 | + * <p/> | |
| 144 | + * 如向上转型到Object仍无法找到, 返回null. | |
| 145 | + */ | |
| 146 | + public static Field getAccessibleField(final Object obj, | |
| 147 | + final String fieldName) { | |
| 148 | + Assert.notNull(obj, "object不能为空"); | |
| 149 | + Assert.hasText(fieldName, "fieldName"); | |
| 150 | + for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass | |
| 151 | + .getSuperclass()) { | |
| 152 | + try { | |
| 153 | + Field field = superClass.getDeclaredField(fieldName); | |
| 154 | + field.setAccessible(true); | |
| 155 | + return field; | |
| 156 | + } catch (NoSuchFieldException e) {// NOSONAR | |
| 157 | + // Field不在当前类定义,继续向上转型 | |
| 158 | + } | |
| 159 | + } | |
| 160 | + return null; | |
| 161 | + } | |
| 168 | 162 | |
| 169 | - /** | |
| 170 | - * 直接调用对象方法, 无视private/protected修饰符. 用于一次性调用的情况. | |
| 171 | - */ | |
| 172 | - public static Object invokeMethod(final Object obj, | |
| 173 | - final String methodName, final Class<?>[] parameterTypes, | |
| 174 | - final Object[] args) { | |
| 175 | - Method method = getAccessibleMethod(obj, methodName, parameterTypes); | |
| 176 | - if (method == null) { | |
| 177 | - throw new IllegalArgumentException("Could not find method [" | |
| 178 | - + methodName + "] on target [" + obj + "]"); | |
| 179 | - } | |
| 163 | + /** | |
| 164 | + * 直接调用对象方法, 无视private/protected修饰符. 用于一次性调用的情况. | |
| 165 | + */ | |
| 166 | + public static Object invokeMethod(final Object obj, | |
| 167 | + final String methodName, final Class<?>[] parameterTypes, | |
| 168 | + final Object[] args) { | |
| 169 | + Method method = getAccessibleMethod(obj, methodName, parameterTypes); | |
| 170 | + if (method == null) { | |
| 171 | + throw new IllegalArgumentException("Could not find method [" | |
| 172 | + + methodName + "] on target [" + obj + "]"); | |
| 173 | + } | |
| 180 | 174 | |
| 181 | - try { | |
| 182 | - return method.invoke(obj, args); | |
| 183 | - } catch (Exception e) { | |
| 184 | - throw convertReflectionExceptionToUnchecked(e); | |
| 185 | - } | |
| 186 | - } | |
| 175 | + try { | |
| 176 | + return method.invoke(obj, args); | |
| 177 | + } catch (Exception e) { | |
| 178 | + throw convertReflectionExceptionToUnchecked(e); | |
| 179 | + } | |
| 180 | + } | |
| 187 | 181 | |
| 188 | - /** | |
| 189 | - * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null. | |
| 190 | - * | |
| 191 | - * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... | |
| 192 | - * args) | |
| 193 | - */ | |
| 194 | - public static Method getAccessibleMethod(final Object obj, | |
| 195 | - final String methodName, final Class<?>... parameterTypes) { | |
| 196 | - Assert.notNull(obj, "object不能为空"); | |
| 182 | + /** | |
| 183 | + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null. | |
| 184 | + * <p/> | |
| 185 | + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... | |
| 186 | + * args) | |
| 187 | + */ | |
| 188 | + public static Method getAccessibleMethod(final Object obj, | |
| 189 | + final String methodName, final Class<?>... parameterTypes) { | |
| 190 | + Assert.notNull(obj, "object不能为空"); | |
| 197 | 191 | |
| 198 | - for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass | |
| 199 | - .getSuperclass()) { | |
| 200 | - try { | |
| 201 | - Method method = superClass.getDeclaredMethod(methodName, | |
| 202 | - parameterTypes); | |
| 192 | + for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass | |
| 193 | + .getSuperclass()) { | |
| 194 | + try { | |
| 195 | + Method method = superClass.getDeclaredMethod(methodName, | |
| 196 | + parameterTypes); | |
| 203 | 197 | |
| 204 | - method.setAccessible(true); | |
| 198 | + method.setAccessible(true); | |
| 205 | 199 | |
| 206 | - return method; | |
| 200 | + return method; | |
| 207 | 201 | |
| 208 | - } catch (NoSuchMethodException e) {// NOSONAR | |
| 209 | - // Method不在当前类定义,继续向上转型 | |
| 210 | - } | |
| 211 | - } | |
| 212 | - return null; | |
| 213 | - } | |
| 202 | + } catch (NoSuchMethodException e) {// NOSONAR | |
| 203 | + // Method不在当前类定义,继续向上转型 | |
| 204 | + } | |
| 205 | + } | |
| 206 | + return null; | |
| 207 | + } | |
| 214 | 208 | |
| 215 | - /** | |
| 216 | - * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. eg. public UserDao | |
| 217 | - * extends HibernateDao<User> | |
| 218 | - * | |
| 219 | - * @param clazz | |
| 220 | - * The class to introspect | |
| 221 | - * @return the first generic declaration, or Object.class if cannot be | |
| 222 | - * determined | |
| 223 | - */ | |
| 224 | - @SuppressWarnings({ "unchecked", "rawtypes" }) | |
| 225 | - public static <T> Class<T> getSuperClassGenricType(final Class clazz) { | |
| 226 | - return getSuperClassGenricType(clazz, 0); | |
| 227 | - } | |
| 209 | + /** | |
| 210 | + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. eg. public UserDao | |
| 211 | + * extends HibernateDao<User> | |
| 212 | + * | |
| 213 | + * @param clazz The class to introspect | |
| 214 | + * @return the first generic declaration, or Object.class if cannot be | |
| 215 | + * determined | |
| 216 | + */ | |
| 217 | + @SuppressWarnings({"unchecked", "rawtypes"}) | |
| 218 | + public static <T> Class<T> getSuperClassGenricType(final Class clazz) { | |
| 219 | + return getSuperClassGenricType(clazz, 0); | |
| 220 | + } | |
| 228 | 221 | |
| 229 | - /** | |
| 230 | - * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. | |
| 231 | - * | |
| 232 | - * 如public UserDao extends HibernateDao<User,Long> | |
| 233 | - * | |
| 234 | - * @param clazz | |
| 235 | - * clazz The class to introspect | |
| 236 | - * @param index | |
| 237 | - * the Index of the generic ddeclaration,start from 0. | |
| 238 | - * @return the index generic declaration, or Object.class if cannot be | |
| 239 | - * determined | |
| 240 | - */ | |
| 241 | - @SuppressWarnings("rawtypes") | |
| 242 | - public static Class getSuperClassGenricType(final Class clazz, | |
| 243 | - final int index) { | |
| 222 | + /** | |
| 223 | + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. | |
| 224 | + * <p/> | |
| 225 | + * 如public UserDao extends HibernateDao<User,Long> | |
| 226 | + * | |
| 227 | + * @param clazz clazz The class to introspect | |
| 228 | + * @param index the Index of the generic ddeclaration,start from 0. | |
| 229 | + * @return the index generic declaration, or Object.class if cannot be | |
| 230 | + * determined | |
| 231 | + */ | |
| 232 | + @SuppressWarnings("rawtypes") | |
| 233 | + public static Class getSuperClassGenricType(final Class clazz, | |
| 234 | + final int index) { | |
| 244 | 235 | |
| 245 | - if (classInstance.containsKey(clazz)) { | |
| 246 | - return classInstance.get(clazz); | |
| 247 | - } | |
| 236 | + if (classInstance.containsKey(clazz)) { | |
| 237 | + return classInstance.get(clazz); | |
| 238 | + } | |
| 248 | 239 | |
| 249 | - Type genType = clazz.getGenericSuperclass(); | |
| 240 | + Type genType = clazz.getGenericSuperclass(); | |
| 250 | 241 | |
| 251 | - if (!(genType instanceof ParameterizedType)) { | |
| 252 | - logger.warn(clazz.getSimpleName() | |
| 253 | - + "'s superclass not ParameterizedType"); | |
| 254 | - return Object.class; | |
| 255 | - } | |
| 242 | + if (!(genType instanceof ParameterizedType)) { | |
| 243 | + logger.warn(clazz.getSimpleName() | |
| 244 | + + "'s superclass not ParameterizedType"); | |
| 245 | + return Object.class; | |
| 246 | + } | |
| 256 | 247 | |
| 257 | - Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); | |
| 248 | + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); | |
| 258 | 249 | |
| 259 | - if (index >= params.length || index < 0) { | |
| 260 | - logger.warn("Index: " + index + ", Size of " | |
| 261 | - + clazz.getSimpleName() + "'s Parameterized Type: " | |
| 262 | - + params.length); | |
| 263 | - return Object.class; | |
| 264 | - } | |
| 265 | - if (!(params[index] instanceof Class)) { | |
| 266 | - logger.warn(clazz.getSimpleName() | |
| 267 | - + " not set the actual class on superclass generic parameter"); | |
| 268 | - return Object.class; | |
| 269 | - } | |
| 270 | - Class classGenricType = (Class) params[index]; | |
| 271 | - classInstance.put(clazz, classGenricType); | |
| 272 | - return classGenricType; | |
| 273 | - } | |
| 250 | + if (index >= params.length || index < 0) { | |
| 251 | + logger.warn("Index: " + index + ", Size of " | |
| 252 | + + clazz.getSimpleName() + "'s Parameterized Type: " | |
| 253 | + + params.length); | |
| 254 | + return Object.class; | |
| 255 | + } | |
| 256 | + if (!(params[index] instanceof Class)) { | |
| 257 | + logger.warn(clazz.getSimpleName() | |
| 258 | + + " not set the actual class on superclass generic parameter"); | |
| 259 | + return Object.class; | |
| 260 | + } | |
| 261 | + Class classGenricType = (Class) params[index]; | |
| 262 | + classInstance.put(clazz, classGenricType); | |
| 263 | + return classGenricType; | |
| 264 | + } | |
| 274 | 265 | |
| 275 | - /** | |
| 276 | - * 将反射时的checked exception转换为unchecked exception. | |
| 277 | - */ | |
| 278 | - public static RuntimeException convertReflectionExceptionToUnchecked( | |
| 279 | - Exception e) { | |
| 280 | - if (e instanceof IllegalAccessException | |
| 281 | - || e instanceof IllegalArgumentException | |
| 282 | - || e instanceof NoSuchMethodException) { | |
| 283 | - return new IllegalArgumentException("Reflection Exception.", e); | |
| 284 | - } else if (e instanceof InvocationTargetException) { | |
| 285 | - return new RuntimeException("Reflection Exception.", | |
| 286 | - ((InvocationTargetException) e).getTargetException()); | |
| 287 | - } else if (e instanceof RuntimeException) { | |
| 288 | - return (RuntimeException) e; | |
| 289 | - } | |
| 290 | - return new RuntimeException("Unexpected Checked Exception.", e); | |
| 291 | - } | |
| 292 | - | |
| 293 | - /** | |
| 294 | - * | |
| 295 | - * 传入一个对象获取到这个对象需要修改的字段值 | |
| 296 | - * | |
| 297 | - * @param object | |
| 298 | - * @return | |
| 299 | - */ | |
| 300 | - public static Map<String,Object> getUpdateField(Object object){ | |
| 301 | - Map<String,Object> resultMap = new HashMap<String,Object>(); | |
| 302 | - if(null==object){ | |
| 303 | - return resultMap; | |
| 304 | - } | |
| 305 | - Field [] fields1 = object.getClass().getDeclaredFields(); | |
| 306 | - Field [] fields2 = object.getClass().getSuperclass().getDeclaredFields(); | |
| 307 | - //子对象和父对象的字段 | |
| 308 | - Field [] fields = ArrayUtils.merge(fields1,fields2); | |
| 266 | + /** | |
| 267 | + * 将反射时的checked exception转换为unchecked exception. | |
| 268 | + */ | |
| 269 | + public static RuntimeException convertReflectionExceptionToUnchecked( | |
| 270 | + Exception e) { | |
| 271 | + if (e instanceof IllegalAccessException | |
| 272 | + || e instanceof IllegalArgumentException | |
| 273 | + || e instanceof NoSuchMethodException) { | |
| 274 | + return new IllegalArgumentException("Reflection Exception.", e); | |
| 275 | + } else if (e instanceof InvocationTargetException) { | |
| 276 | + return new RuntimeException("Reflection Exception.", | |
| 277 | + ((InvocationTargetException) e).getTargetException()); | |
| 278 | + } else if (e instanceof RuntimeException) { | |
| 279 | + return (RuntimeException) e; | |
| 280 | + } | |
| 281 | + return new RuntimeException("Unexpected Checked Exception.", e); | |
| 282 | + } | |
| 309 | 283 | |
| 310 | - Object result = null; | |
| 311 | - String name = null; | |
| 312 | - for(Field field:fields){ | |
| 313 | - field.setAccessible(true); | |
| 314 | - name= field.getName(); | |
| 315 | - //过滤掉序列化的字段 | |
| 316 | - if("serialVersionUID".equals(name)){ | |
| 317 | - continue; | |
| 318 | - } | |
| 319 | - try { | |
| 320 | - result = field.get(object); | |
| 321 | - } catch (Exception e) { | |
| 322 | - } | |
| 323 | - if(null!=result){ | |
| 324 | - resultMap.put(name, result); | |
| 325 | - } | |
| 326 | - } | |
| 327 | - return resultMap; | |
| 328 | - } | |
| 284 | + /** | |
| 285 | + * 传入一个对象获取到这个对象需要修改的字段值 | |
| 286 | + * | |
| 287 | + * @param object | |
| 288 | + * @return | |
| 289 | + */ | |
| 290 | + public static Map<String, Object> getUpdateField(Object object) { | |
| 291 | + Map<String, Object> resultMap = new HashMap<String, Object>(); | |
| 292 | + if (null == object) { | |
| 293 | + return resultMap; | |
| 294 | + } | |
| 295 | + Field[] fields1 = object.getClass().getDeclaredFields(); | |
| 296 | + Field[] fields2 = object.getClass().getSuperclass().getDeclaredFields(); | |
| 297 | + //子对象和父对象的字段 | |
| 298 | + Field[] fields = ArrayUtils.merge(fields1, fields2); | |
| 299 | + | |
| 300 | + Object result = null; | |
| 301 | + String name = null; | |
| 302 | + for (Field field : fields) { | |
| 303 | +/** | |
| 304 | + * | |
| 305 | + native transient volatile synchronized final static protected private public | |
| 306 | + | |
| 307 | + 0 0 0 0 0 1 0 0 1 | |
| 308 | + */ | |
| 309 | + ; | |
| 310 | + //排除static /final的字段 | |
| 311 | + if (64>field.getModifiers()&&field.getModifiers() >= 12) { | |
| 312 | + continue; | |
| 313 | + } | |
| 314 | + field.setAccessible(true); | |
| 315 | + name = field.getName(); | |
| 316 | + try { | |
| 317 | + result = field.get(object); | |
| 318 | + } catch (Exception e) { | |
| 319 | + } | |
| 320 | + if (null != result) { | |
| 321 | + resultMap.put(name, result); | |
| 322 | + } | |
| 323 | + } | |
| 324 | + return resultMap; | |
| 325 | + } | |
| 329 | 326 | } |