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