|
@@ -0,0 +1,92 @@
|
|
|
+package com.ruoyi.common.utils.bean;
|
|
|
+
|
|
|
+import java.lang.reflect.Array;
|
|
|
+import java.lang.reflect.Field;
|
|
|
+import java.lang.reflect.Modifier;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+public class InstanceUtil {
|
|
|
+ public static List<String> types = new ArrayList<String>();
|
|
|
+ static {
|
|
|
+ types.add("java.lang.Integer");
|
|
|
+ types.add("java.lang.Double");
|
|
|
+ types.add("java.lang.Float");
|
|
|
+ types.add("java.lang.Long");
|
|
|
+ types.add("java.lang.Short");
|
|
|
+ types.add("java.lang.Byte");
|
|
|
+ types.add("java.lang.Boolean");
|
|
|
+ types.add("java.lang.Character");
|
|
|
+ types.add("java.lang.String");
|
|
|
+ types.add("int");
|
|
|
+ types.add("double");
|
|
|
+ types.add("long");
|
|
|
+ types.add("short");
|
|
|
+ types.add("byte");
|
|
|
+ types.add("boolean");
|
|
|
+ types.add("char");
|
|
|
+ types.add("float");
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 利用反射合并两个实例类,将newProperties中的属性覆盖到preProperties,
|
|
|
+ * 如果newProperties中的属性为空,则保留preProperties中的属性
|
|
|
+ *
|
|
|
+ * 已经支持递归覆盖.对成员变量是Object的成员变量进行递归
|
|
|
+ * 如果成员变量是子类,还可以找它的父类向上覆盖
|
|
|
+ *
|
|
|
+ * @param preDeviceProperties 之前旧的实例属性
|
|
|
+ * @param newDeviceProperties 新的实例属性
|
|
|
+ * @param <T> 返回合并后的实例属性
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static <T> T mergeDeviceProperties(T preDeviceProperties, T newDeviceProperties) throws IllegalAccessException {
|
|
|
+ if (preDeviceProperties == null) {
|
|
|
+ preDeviceProperties = newDeviceProperties;
|
|
|
+ return preDeviceProperties;
|
|
|
+ }
|
|
|
+ Class tClass = newDeviceProperties.getClass();
|
|
|
+ while (tClass != null) {
|
|
|
+ merge(preDeviceProperties, tClass.cast(newDeviceProperties));
|
|
|
+ tClass = tClass.getSuperclass();
|
|
|
+ }
|
|
|
+ return preDeviceProperties;
|
|
|
+ }
|
|
|
+ private static <T> T merge(T preDeviceProperties, T newDeviceProperties) throws IllegalAccessException {
|
|
|
+ Field[] preFileds = preDeviceProperties.getClass().getDeclaredFields();
|
|
|
+ Field[] newFileds = newDeviceProperties.getClass().getDeclaredFields();
|
|
|
+
|
|
|
+ for (int i = 0; i < preFileds.length; i++) {
|
|
|
+ Field preField = preFileds[i];
|
|
|
+ Field newField = preFileds[i];
|
|
|
+ if (Modifier.isStatic(newField.getModifiers())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Field targetField = newFileds[i];
|
|
|
+ if (Modifier.isStatic(targetField.getModifiers())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ preField.setAccessible(true);
|
|
|
+ newField.setAccessible(true);
|
|
|
+
|
|
|
+ if(null != newField.get(newDeviceProperties)){
|
|
|
+ //如果成员变量是个数组,那么遍历数组的每个对象并进行递归合并
|
|
|
+ if(preField.getType().isArray()){
|
|
|
+ int length = Array.getLength(preField.get(preDeviceProperties));
|
|
|
+ for(int j=0;j<length;j++){
|
|
|
+ Object preDeProperty = Array.get(preField.get(preDeviceProperties),j);
|
|
|
+ Object newDeProperty = Array.get(newField.get(newDeviceProperties),j);
|
|
|
+ mergeDeviceProperties(preDeProperty,newDeProperty);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果成员变量不是基本数据类型或者包装类型,则进行递归遍历
|
|
|
+ else if (!types.contains(preField.getType().getName())) {
|
|
|
+ mergeDeviceProperties(preField.get(preDeviceProperties), newField.get(newDeviceProperties));
|
|
|
+ } else {
|
|
|
+ preField.set(preDeviceProperties, newField.get(newDeviceProperties));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return preDeviceProperties;
|
|
|
+ }
|
|
|
+}
|