Forráskód Böngészése

修改 class 实例化对象的方式,现在可以实例化私有 class

HCL 7 éve
szülő
commit
42056056bf

+ 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 对象
      * @return 返回 bean 对象
      */
      */
     public static <T> T mapToBean(Map<String, Object> map, Class<T> clazz) {
     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;
     }
     }
 
 
     /**
     /**

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

@@ -16,6 +16,8 @@
  */
  */
 package com.baomidou.mybatisplus.core.toolkit;
 package com.baomidou.mybatisplus.core.toolkit;
 
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 
 
@@ -23,6 +25,7 @@ import java.util.List;
  * ClassUtils
  * ClassUtils
  *
  *
  * @author Caratacus
  * @author Caratacus
+ * @author HCL
  * @since 2017/07/08
  * @since 2017/07/08
  */
  */
 public final class ClassUtils {
 public final class ClassUtils {
@@ -79,4 +82,21 @@ public final class ClassUtils {
         return getUserClass(object.getClass());
         return getUserClass(object.getClass());
     }
     }
 
 
+    /**
+     * 根据指定的 class , 实例化一个对象,根据构造参数来实例化
+     *
+     * @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);
+        }
+    }
+
 }
 }

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

@@ -0,0 +1,25 @@
+package com.baomidou.mybatisplus.core.toolkit;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+
+/**
+ * 测试
+ *
+ * @author HCL
+ * 2018/7/26 9:53
+ */
+public class ClassUtilsTest {
+
+    @Test
+    public void newInstanceTest() {
+        Demo demo = ClassUtils.newInstance(Demo.class);
+        Map map = ClassUtils.newInstance(HashMap.class);
+    }
+
+    private static class Demo {
+
+    }
+}