From 08ecda4cd21bedd0e615bc2e2ea3380dcedccb3c Mon Sep 17 00:00:00 2001 From: achao Date: Sat, 4 Jun 2022 13:50:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AF=B9instantiatedType?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/lang/func/LambdaInfo.java | 20 +++++++++++++------ .../hutool/core/lang/func/LambdaUtilTest.java | 4 ++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaInfo.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaInfo.java index 7a5eca69d..6012b6c0f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaInfo.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaInfo.java @@ -2,7 +2,6 @@ package cn.hutool.core.lang.func; import cn.hutool.core.classloader.ClassLoaderUtil; import cn.hutool.core.reflect.FieldUtil; -import cn.hutool.core.text.StrUtil; import java.lang.invoke.SerializedLambda; import java.lang.reflect.Constructor; @@ -41,13 +40,22 @@ public class LambdaInfo { } int index = lambda.getInstantiatedMethodType().indexOf(";)"); if (index > -1) { - String[] instantiatedTypeNames = StrUtil.sub(lambda.getInstantiatedMethodType(), 2, index).split(";L"); - this.instantiatedTypes = new Type[instantiatedTypeNames.length]; - for (int i = 0; i < instantiatedTypeNames.length; i++) { - this.instantiatedTypes[i] = ClassLoaderUtil.loadClass(instantiatedTypeNames[i]); + boolean isArray = lambda.getInstantiatedMethodType().startsWith("(["); + if (isArray) { + try { + this.instantiatedTypes = new Type[]{Class.forName(lambda.getInstantiatedMethodType().replace("/", ".").substring(0, index).substring(1) + ";")}; + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + } else { + String[] instantiatedTypeNames = lambda.getInstantiatedMethodType().substring(2, index).split(";L"); + this.instantiatedTypes = new Type[instantiatedTypeNames.length]; + for (int i = 0; i < instantiatedTypeNames.length; i++) { + this.instantiatedTypes[i] = ClassLoaderUtil.loadClass(instantiatedTypeNames[i]); + } } } else { - instantiatedTypes = new Type[0]; + this.instantiatedTypes = new Type[0]; } this.clazz = (Class) FieldUtil.getFieldValue(executable, "clazz"); this.executable = executable; diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java index 37fb1833e..16660af6f 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java @@ -128,6 +128,10 @@ public class LambdaUtilTest { // 引用父类静态无参方法,能够获取到正确的参数类型 Func1 lambda = MyTeacher::takeIdBy; Assert.assertEquals(MyTeacher.class, LambdaUtil.getRealClass(lambda)); + }, () -> { + // 数组测试 + VoidFunc1 lambda = (String[] stringList) -> {}; + Assert.assertEquals(String[].class, LambdaUtil.getRealClass(lambda)); }).forEach(Runnable::run); }