Explorar o código

Merge remote-tracking branch 'origin/3.0' into 3.0

miemie %!s(int64=6) %!d(string=hai) anos
pai
achega
b411698ba3

+ 3 - 7
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/BeanUtils.java

@@ -43,13 +43,9 @@ public final class BeanUtils {
      * @return 返回 bean 对象
      */
     public static <T> T mapToBean(Map<String, Object> map, Class<T> clazz) {
-        try {
-            T bean = clazz.newInstance();
-            BeanMap.create(bean).putAll(map);
-            return bean;
-        } catch (IllegalAccessException | InstantiationException e) {
-            throw ExceptionUtils.mpe(e);
-        }
+        T bean = ClassUtils.newInstance(clazz);
+        BeanMap.create(bean).putAll(map);
+        return bean;
     }
 
     /**

+ 22 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/ClassUtils.java

@@ -16,6 +16,8 @@
  */
 package com.baomidou.mybatisplus.core.toolkit;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
 import java.util.List;
 
@@ -23,6 +25,7 @@ import java.util.List;
  * ClassUtils
  *
  * @author Caratacus
+ * @author HCL
  * @since 2017/07/08
  */
 public final class ClassUtils {
@@ -79,4 +82,23 @@ public final class ClassUtils {
         return getUserClass(object.getClass());
     }
 
+    /**
+     * 根据指定的 class , 实例化一个对象,根据构造参数来实例化
+     * <p>
+     * 在 java9 及其之后的版本 Class.newInstance() 方法已被废弃
+     *
+     * @param clazz 需要实例化的对象
+     * @param <T>   类型,由输入类型决定
+     * @return 返回新的实例
+     */
+    public static <T> T newInstance(Class<T> clazz) {
+        try {
+            Constructor<T> constructor = clazz.getDeclaredConstructor();
+            constructor.setAccessible(true);
+            return constructor.newInstance();
+        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+            throw ExceptionUtils.mpe("实例化对象时出现错误,请尝试给 " + clazz.getName() + "添加无参的构造方法", e);
+        }
+    }
+
 }

+ 36 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/toolkit/ClassUtilsTest.java

@@ -0,0 +1,36 @@
+package com.baomidou.mybatisplus.core.toolkit;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * 测试
+ *
+ * @author HCL
+ * 2018/7/26 9:53
+ */
+public class ClassUtilsTest {
+
+    /**
+     * 测试实例化方法
+     */
+    @Test
+    public void newInstanceTest() {
+        // 根据设计,只要能实例化,并且 对象不为 null , 即认为执行成功
+        Demo demo = ClassUtils.newInstance(Demo.class);
+        Assert.assertNotNull(demo);
+
+        Map map = ClassUtils.newInstance(HashMap.class);
+        Assert.assertNotNull(map);
+    }
+
+    /**
+     * 实例化的 demo class
+     */
+    private static class Demo {
+
+    }
+}