diff --git a/platform-common/src/main/java/com/lyms/platform/common/utils/ReflectionUtils.java b/platform-common/src/main/java/com/lyms/platform/common/utils/ReflectionUtils.java index e6fda0c..d500112 100644 --- a/platform-common/src/main/java/com/lyms/platform/common/utils/ReflectionUtils.java +++ b/platform-common/src/main/java/com/lyms/platform/common/utils/ReflectionUtils.java @@ -3,11 +3,7 @@ package com.lyms.platform.common.utils; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; +import java.lang.reflect.*; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -22,56 +18,55 @@ import org.springframework.util.Assert; /** * 反射工具类. - * + *

* 提供访问私有变量,获取泛型类型Class, 提取集合中元素的属性, 转换字符串到对象等Util函数. - * */ public class ReflectionUtils { - private static Logger logger = LoggerFactory - .getLogger(ReflectionUtils.class); - - private static final ConcurrentHashMap, Class> classInstance = new ConcurrentHashMap, Class> (); - - /** - * 调用Getter方法. - */ - public static Object invokeGetterMethod(Object obj, String propertyName) { - String getterMethodName = "get" + StringUtils.capitalize(propertyName); - return invokeMethod(obj, getterMethodName, new Class[] {}, - new Object[] {}); - } - - public static Map beanToMap(Object obj) { - if(obj == null){ - return null; - } - Map map = new HashMap(); - try { - BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); - PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); - for (PropertyDescriptor property : propertyDescriptors) { - String key = property.getName(); - // 过滤class属性 - if (!key.equals("class")) { - // 得到property对应的getter方法 - Method getter = property.getReadMethod(); - Object value = getter.invoke(obj); - - map.put(key, value); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return map; - - } - - public static Map beanToStrMap(Object obj) { + private static Logger logger = LoggerFactory + .getLogger(ReflectionUtils.class); + + private static final ConcurrentHashMap, Class> classInstance = new ConcurrentHashMap, Class>(); + + /** + * 调用Getter方法. + */ + public static Object invokeGetterMethod(Object obj, String propertyName) { + String getterMethodName = "get" + StringUtils.capitalize(propertyName); + return invokeMethod(obj, getterMethodName, new Class[]{}, + new Object[]{}); + } + + public static Map beanToMap(Object obj) { + if (obj == null) { + return null; + } + Map map = new HashMap(); + try { + BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); + PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); + for (PropertyDescriptor property : propertyDescriptors) { + String key = property.getName(); + // 过滤class属性 + if (!key.equals("class")) { + // 得到property对应的getter方法 + Method getter = property.getReadMethod(); + Object value = getter.invoke(obj); + + map.put(key, value); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return map; + + } + + public static Map beanToStrMap(Object obj) { Map map = beanToMap(obj); Map restMap = new HashMap<>(); - if(MapUtils.isNotEmpty(map)) { + if (MapUtils.isNotEmpty(map)) { Set> entries = map.entrySet(); Iterator> iterator = entries.iterator(); while (iterator.hasNext()) { @@ -81,249 +76,251 @@ public class ReflectionUtils { } return restMap; - } - - /** - * 调用Setter方法.使用value的Class来查找Setter方法. - */ - public static void invokeSetterMethod(Object obj, String propertyName, - Object value) { - invokeSetterMethod(obj, propertyName, value, null); - } - - /** - * 调用Setter方法. - * - * @param propertyType - * 用于查找Setter方法,为空时使用value的Class替代. - */ - public static void invokeSetterMethod(Object obj, String propertyName, - Object value, Class propertyType) { - Class type = propertyType != null ? propertyType : value.getClass(); - String setterMethodName = "set" + StringUtils.capitalize(propertyName); - invokeMethod(obj, setterMethodName, new Class[] { type }, - new Object[] { value }); - } - - /** - * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. - */ - public static Object getFieldValue(final Object obj, final String fieldName) { - Field field = getAccessibleField(obj, fieldName); - - if (field == null) { - throw new IllegalArgumentException("Could not find field [" - + fieldName + "] on target [" + obj + "]"); - } - - Object result = null; - try { - result = field.get(obj); - } catch (IllegalAccessException e) { - logger.error("不可能抛出的异常{}", e.getMessage()); - } - return result; - } - - /** - * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. - */ - public static void setFieldValue(final Object obj, final String fieldName, - final Object value) { - Field field = getAccessibleField(obj, fieldName); - - if (field == null) { - throw new IllegalArgumentException("Could not find field [" - + fieldName + "] on target [" + obj + "]"); - } - - try { - field.set(obj, value); - } catch (IllegalAccessException e) { - logger.error("不可能抛出的异常:{}", e.getMessage()); - } - } - - /** - * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. - * - * 如向上转型到Object仍无法找到, 返回null. - */ - public static Field getAccessibleField(final Object obj, - final String fieldName) { - Assert.notNull(obj, "object不能为空"); - Assert.hasText(fieldName, "fieldName"); - for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass - .getSuperclass()) { - try { - Field field = superClass.getDeclaredField(fieldName); - field.setAccessible(true); - return field; - } catch (NoSuchFieldException e) {// NOSONAR - // Field不在当前类定义,继续向上转型 - } - } - return null; - } - - /** - * 直接调用对象方法, 无视private/protected修饰符. 用于一次性调用的情况. - */ - public static Object invokeMethod(final Object obj, - final String methodName, final Class[] parameterTypes, - final Object[] args) { - Method method = getAccessibleMethod(obj, methodName, parameterTypes); - if (method == null) { - throw new IllegalArgumentException("Could not find method [" - + methodName + "] on target [" + obj + "]"); - } - - try { - return method.invoke(obj, args); - } catch (Exception e) { - throw convertReflectionExceptionToUnchecked(e); - } - } - - /** - * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null. - * - * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... - * args) - */ - public static Method getAccessibleMethod(final Object obj, - final String methodName, final Class... parameterTypes) { - Assert.notNull(obj, "object不能为空"); - - for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass - .getSuperclass()) { - try { - Method method = superClass.getDeclaredMethod(methodName, - parameterTypes); - - method.setAccessible(true); - - return method; - - } catch (NoSuchMethodException e) {// NOSONAR - // Method不在当前类定义,继续向上转型 - } - } - return null; - } - - /** - * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. eg. public UserDao - * extends HibernateDao - * - * @param clazz - * The class to introspect - * @return the first generic declaration, or Object.class if cannot be - * determined - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - public static Class getSuperClassGenricType(final Class clazz) { - return getSuperClassGenricType(clazz, 0); - } - - /** - * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. - * - * 如public UserDao extends HibernateDao - * - * @param clazz - * clazz The class to introspect - * @param index - * the Index of the generic ddeclaration,start from 0. - * @return the index generic declaration, or Object.class if cannot be - * determined - */ - @SuppressWarnings("rawtypes") - public static Class getSuperClassGenricType(final Class clazz, - final int index) { - - if (classInstance.containsKey(clazz)) { - return classInstance.get(clazz); - } - - Type genType = clazz.getGenericSuperclass(); - - if (!(genType instanceof ParameterizedType)) { - logger.warn(clazz.getSimpleName() - + "'s superclass not ParameterizedType"); - return Object.class; - } - - Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); - - if (index >= params.length || index < 0) { - logger.warn("Index: " + index + ", Size of " - + clazz.getSimpleName() + "'s Parameterized Type: " - + params.length); - return Object.class; - } - if (!(params[index] instanceof Class)) { - logger.warn(clazz.getSimpleName() - + " not set the actual class on superclass generic parameter"); - return Object.class; - } - Class classGenricType = (Class) params[index]; - classInstance.put(clazz, classGenricType); - return classGenricType; - } - - /** - * 将反射时的checked exception转换为unchecked exception. - */ - public static RuntimeException convertReflectionExceptionToUnchecked( - Exception e) { - if (e instanceof IllegalAccessException - || e instanceof IllegalArgumentException - || e instanceof NoSuchMethodException) { - return new IllegalArgumentException("Reflection Exception.", e); - } else if (e instanceof InvocationTargetException) { - return new RuntimeException("Reflection Exception.", - ((InvocationTargetException) e).getTargetException()); - } else if (e instanceof RuntimeException) { - return (RuntimeException) e; - } - return new RuntimeException("Unexpected Checked Exception.", e); - } - - /** - * - * 传入一个对象获取到这个对象需要修改的字段值 - * - * @param object - * @return - */ - public static Map getUpdateField(Object object){ - Map resultMap = new HashMap(); - if(null==object){ - return resultMap; - } - Field [] fields1 = object.getClass().getDeclaredFields(); - Field [] fields2 = object.getClass().getSuperclass().getDeclaredFields(); - //子对象和父对象的字段 - Field [] fields = ArrayUtils.merge(fields1,fields2); - - Object result = null; - String name = null; - for(Field field:fields){ - field.setAccessible(true); - name= field.getName(); - //过滤掉序列化的字段 - if("serialVersionUID".equals(name)){ - continue; - } - try { - result = field.get(object); - } catch (Exception e) { - } - if(null!=result){ - resultMap.put(name, result); - } - } - return resultMap; - } + } + + /** + * 调用Setter方法.使用value的Class来查找Setter方法. + */ + public static void invokeSetterMethod(Object obj, String propertyName, + Object value) { + invokeSetterMethod(obj, propertyName, value, null); + } + + /** + * 调用Setter方法. + * + * @param propertyType 用于查找Setter方法,为空时使用value的Class替代. + */ + public static void invokeSetterMethod(Object obj, String propertyName, + Object value, Class propertyType) { + Class type = propertyType != null ? propertyType : value.getClass(); + String setterMethodName = "set" + StringUtils.capitalize(propertyName); + invokeMethod(obj, setterMethodName, new Class[]{type}, + new Object[]{value}); + } + + /** + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. + */ + public static Object getFieldValue(final Object obj, final String fieldName) { + Field field = getAccessibleField(obj, fieldName); + + if (field == null) { + throw new IllegalArgumentException("Could not find field [" + + fieldName + "] on target [" + obj + "]"); + } + + Object result = null; + try { + result = field.get(obj); + } catch (IllegalAccessException e) { + logger.error("不可能抛出的异常{}", e.getMessage()); + } + return result; + } + + /** + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. + */ + public static void setFieldValue(final Object obj, final String fieldName, + final Object value) { + Field field = getAccessibleField(obj, fieldName); + + if (field == null) { + throw new IllegalArgumentException("Could not find field [" + + fieldName + "] on target [" + obj + "]"); + } + + try { + field.set(obj, value); + } catch (IllegalAccessException e) { + logger.error("不可能抛出的异常:{}", e.getMessage()); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. + *

+ * 如向上转型到Object仍无法找到, 返回null. + */ + public static Field getAccessibleField(final Object obj, + final String fieldName) { + Assert.notNull(obj, "object不能为空"); + Assert.hasText(fieldName, "fieldName"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass + .getSuperclass()) { + try { + Field field = superClass.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) {// NOSONAR + // Field不在当前类定义,继续向上转型 + } + } + return null; + } + + /** + * 直接调用对象方法, 无视private/protected修饰符. 用于一次性调用的情况. + */ + public static Object invokeMethod(final Object obj, + final String methodName, final Class[] parameterTypes, + final Object[] args) { + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) { + throw new IllegalArgumentException("Could not find method [" + + methodName + "] on target [" + obj + "]"); + } + + try { + return method.invoke(obj, args); + } catch (Exception e) { + throw convertReflectionExceptionToUnchecked(e); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null. + *

+ * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... + * args) + */ + public static Method getAccessibleMethod(final Object obj, + final String methodName, final Class... parameterTypes) { + Assert.notNull(obj, "object不能为空"); + + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass + .getSuperclass()) { + try { + Method method = superClass.getDeclaredMethod(methodName, + parameterTypes); + + method.setAccessible(true); + + return method; + + } catch (NoSuchMethodException e) {// NOSONAR + // Method不在当前类定义,继续向上转型 + } + } + return null; + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. eg. public UserDao + * extends HibernateDao + * + * @param clazz The class to introspect + * @return the first generic declaration, or Object.class if cannot be + * determined + */ + @SuppressWarnings({"unchecked", "rawtypes"}) + public static Class getSuperClassGenricType(final Class clazz) { + return getSuperClassGenricType(clazz, 0); + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. + *

+ * 如public UserDao extends HibernateDao + * + * @param clazz clazz The class to introspect + * @param index the Index of the generic ddeclaration,start from 0. + * @return the index generic declaration, or Object.class if cannot be + * determined + */ + @SuppressWarnings("rawtypes") + public static Class getSuperClassGenricType(final Class clazz, + final int index) { + + if (classInstance.containsKey(clazz)) { + return classInstance.get(clazz); + } + + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) { + logger.warn(clazz.getSimpleName() + + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) { + logger.warn("Index: " + index + ", Size of " + + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) { + logger.warn(clazz.getSimpleName() + + " not set the actual class on superclass generic parameter"); + return Object.class; + } + Class classGenricType = (Class) params[index]; + classInstance.put(clazz, classGenricType); + return classGenricType; + } + + /** + * 将反射时的checked exception转换为unchecked exception. + */ + public static RuntimeException convertReflectionExceptionToUnchecked( + Exception e) { + if (e instanceof IllegalAccessException + || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) { + return new IllegalArgumentException("Reflection Exception.", e); + } else if (e instanceof InvocationTargetException) { + return new RuntimeException("Reflection Exception.", + ((InvocationTargetException) e).getTargetException()); + } else if (e instanceof RuntimeException) { + return (RuntimeException) e; + } + return new RuntimeException("Unexpected Checked Exception.", e); + } + + /** + * 传入一个对象获取到这个对象需要修改的字段值 + * + * @param object + * @return + */ + public static Map getUpdateField(Object object) { + Map resultMap = new HashMap(); + if (null == object) { + return resultMap; + } + Field[] fields1 = object.getClass().getDeclaredFields(); + Field[] fields2 = object.getClass().getSuperclass().getDeclaredFields(); + //子对象和父对象的字段 + Field[] fields = ArrayUtils.merge(fields1, fields2); + + Object result = null; + String name = null; + for (Field field : fields) { +/** + * + native transient volatile synchronized final static protected private public + + 0 0 0 0 0 1 0 0 1 + */ + ; + //排除static /final的字段 + if (64>field.getModifiers()&&field.getModifiers() >= 12) { + continue; + } + field.setAccessible(true); + name = field.getName(); + try { + result = field.get(object); + } catch (Exception e) { + } + if (null != result) { + resultMap.put(name, result); + } + } + return resultMap; + } } \ No newline at end of file