From db96c981e36581fa5bdb6a394a57fe302f8c70b3 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 25 Mar 2023 05:36:14 +0800 Subject: [PATCH] fix code --- .../hutool/core/lang/func/FunctionPool.java | 10 +++++++-- .../hutool/core/lang/func/LambdaFactory.java | 4 +++- .../cn/hutool/core/reflect/ReflectUtil.java | 21 ++++++++++++------- .../java/cn/hutool/core/util/JdkUtil.java | 5 ----- .../java/cn/hutool/core/util/JdkUtilTest.java | 8 +++++++ 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/FunctionPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/FunctionPool.java index b235ad7d8..fdc00cee9 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/func/FunctionPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/FunctionPool.java @@ -1,6 +1,7 @@ package cn.hutool.core.lang.func; import cn.hutool.core.reflect.ConstructorUtil; +import cn.hutool.core.util.JdkUtil; import java.lang.reflect.Constructor; import java.util.function.BiFunction; @@ -23,7 +24,7 @@ public class FunctionPool { static { final Constructor constructor = ConstructorUtil.getConstructor(String.class, char[].class, boolean.class); - STRING_CREATOR_JDK8 = LambdaFactory.build(BiFunction.class, constructor); + STRING_CREATOR_JDK8 = JdkUtil.IS_JDK8 ? LambdaFactory.build(BiFunction.class, constructor) : null; } /** @@ -34,6 +35,11 @@ public class FunctionPool { * @return String */ public static String createString(final char[] value) { - return STRING_CREATOR_JDK8.apply(value, true); + if(JdkUtil.IS_JDK8){ + return STRING_CREATOR_JDK8.apply(value, true); + } else { + // TODO JDK9+优化 + return new String(value); + } } } diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java index 43269e0a8..320df9254 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java @@ -24,6 +24,7 @@ import static java.lang.invoke.MethodType.methodType; /** * 以类似反射的方式动态创建Lambda,在性能上有一定优势,同时避免每次调用Lambda时创建匿名内部类 + * TODO JDK9+存在兼容问题 * * @author nasodaengineer */ @@ -60,7 +61,8 @@ public class LambdaFactory { } /** - * 构建Lambda + * 根据提供的方法或构造对象,构建对应的Lambda函数
+ * 调用函数相当于执行对应的方法或构造 * * @param functionInterfaceType 接受Lambda的函数式接口类型 * @param executable 方法对象,支持构造器 diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/ReflectUtil.java index 0d97aa026..6ec100939 100644 --- a/hutool-core/src/main/java/cn/hutool/core/reflect/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/reflect/ReflectUtil.java @@ -1,14 +1,16 @@ package cn.hutool.core.reflect; import java.lang.reflect.*; +import java.security.AccessController; +import java.security.PrivilegedAction; /** * 反射工具类 * *

- * 本工具类,v6.x进行了重构,原来{@link ReflectUtil}中的方法大部分被移动到了 - * {@link FieldUtil}、{@link MethodUtil}、{@link ModifierUtil}、{@link ConstructorUtil}等中, - * 其他相关方法请参考cn.hutool.core.reflect包下的类,相关类 + * 本工具类,v6.x进行了重构,原来{@link ReflectUtil}中的方法大部分被移动到了 + * {@link FieldUtil}、{@link MethodUtil}、{@link ModifierUtil}、{@link ConstructorUtil}等中, + * 其他相关方法请参考cn.hutool.core.reflect包下的类,相关类 *

*

常用方法变更

* * - * * @author Looly * @since 3.0.9 */ public class ReflectUtil { /** - * 设置方法为可访问(私有方法可以被外部调用) + * 设置方法为可访问(私有方法可以被外部调用)
+ * 注意此方法在jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数 * * @param AccessibleObject的子类,比如Class、Method、Field等 * @param accessibleObject 可设置访问权限的对象,比如Class、Method、Field等 * @return 被设置可访问的对象 + * @throws SecurityException 访问被禁止抛出此异常 * @since 4.6.8 */ - public static T setAccessible(final T accessibleObject) { + public static T setAccessible(final T accessibleObject) throws SecurityException { if (null != accessibleObject && false == accessibleObject.isAccessible()) { - accessibleObject.setAccessible(true); + return AccessController.doPrivileged((PrivilegedAction) () -> { + // 特权访问 + accessibleObject.setAccessible(true); + return accessibleObject; + }); } return accessibleObject; } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/JdkUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/JdkUtil.java index 34bdfd864..0beba0d77 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/JdkUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/JdkUtil.java @@ -23,10 +23,6 @@ public class JdkUtil { */ public static final boolean IS_AT_LEAST_JDK17; - /** - * 是否GraalVM环境 - */ - public static final boolean IS_GRAAL; /** * 是否Android环境 */ @@ -40,7 +36,6 @@ public class JdkUtil { // JVM名称 final String jvmName = _getJvmName(); - IS_GRAAL = jvmName.equals("Substrate VM"); IS_ANDROID = jvmName.equals("Dalvik"); } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/JdkUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/JdkUtilTest.java index f120c39d6..cc5936a88 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/JdkUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/JdkUtilTest.java @@ -1,6 +1,8 @@ package cn.hutool.core.util; +import cn.hutool.core.lang.Console; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; public class JdkUtilTest { @@ -9,4 +11,10 @@ public class JdkUtilTest { final int jvmVersion = JdkUtil.JVM_VERSION; Assert.assertTrue(jvmVersion >= 8); } + + @Test + @Ignore + public void getJvmNameTest() { + Console.log(JdkUtil.IS_AT_LEAST_JDK17); + } }