diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/NullWrapperBean.java b/hutool-core/src/main/java/cn/hutool/core/bean/NullWrapperBean.java new file mode 100644 index 0000000000..053663a040 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/bean/NullWrapperBean.java @@ -0,0 +1,20 @@ +package cn.hutool.core.bean; + +/** + * 为了解决反射过程中,需要传递null参数,但是会丢失参数类型而设立的包装类 + */ +public class NullWrapperBean { + + private final Class> mClasses; + + /** + * @param classes null的类型 + */ + public NullWrapperBean(Class> classes) { + this.mClasses = classes; + } + + public Class> getClasses() { + return mClasses; + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java index 2b190f58e6..c3e3f7930e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java @@ -1,5 +1,6 @@ package cn.hutool.core.util; +import cn.hutool.core.bean.NullWrapperBean; import cn.hutool.core.convert.BasicType; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.io.FileUtil; @@ -139,15 +140,21 @@ public class ClassUtil { * @param objects 对象数组,如果数组中存在{@code null}元素,则此元素被认为是Object类型 * @return 类数组 */ - public static Class>[] getClasses(Object... objects) { - Class>[] classes = new Class>[objects.length]; - Object obj; - for (int i = 0; i < objects.length; i++) { - obj = objects[i]; - classes[i] = (null == obj) ? Object.class : obj.getClass(); - } - return classes; - } + public static Class>[] getClasses(Object... objects) { + Class>[] classes = new Class>[objects.length]; + Object obj; + for (int i = 0; i < objects.length; i++) { + obj = objects[i]; + if (obj instanceof NullWrapperBean) { + classes[i] = ((NullWrapperBean) obj).getClasses(); + } else if (null == obj) { + classes[i] = Object.class; + } else { + classes[i] = obj.getClass(); + } + } + return classes; + } /** * 指定类是否与给定的类名相同 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java index b59bbebcc2..83362163f1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java @@ -1,6 +1,7 @@ package cn.hutool.core.util; import cn.hutool.core.annotation.Alias; +import cn.hutool.core.bean.NullWrapperBean; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.exceptions.UtilException; @@ -864,78 +865,84 @@ public class ReflectUtil { return invoke(obj, method, args); } - /** - * 执行方法 - * - *
- * 对于用户传入参数会做必要检查,包括: - * - *
- * 1、忽略多余的参数 - * 2、参数不够补齐默认值 - * 3、传入参数为null,但是目标参数类型为原始类型,做转换 - *- * - * @param
null
- * @param method 方法(对象方法或static方法都可)
- * @param args 参数对象
- * @return 结果
- * @throws UtilException 一些列异常的包装
- */
- @SuppressWarnings("unchecked")
- public static + * 对于用户传入参数会做必要检查,包括: + * + *
+ * 1、忽略多余的参数 + * 2、参数不够补齐默认值 + * 3、传入参数为null,但是目标参数类型为原始类型,做转换 + *+ * + * @param
null
+ * @param method 方法(对象方法或static方法都可)
+ * @param args 参数对象
+ * @return 结果
+ * @throws UtilException 一些列异常的包装
+ */
+ @SuppressWarnings("unchecked")
+ public static