This commit is contained in:
Looly 2023-03-25 05:36:14 +08:00
parent 46225d8af3
commit db96c981e3
5 changed files with 33 additions and 15 deletions

View File

@ -1,6 +1,7 @@
package cn.hutool.core.lang.func; package cn.hutool.core.lang.func;
import cn.hutool.core.reflect.ConstructorUtil; import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.util.JdkUtil;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.util.function.BiFunction; import java.util.function.BiFunction;
@ -23,7 +24,7 @@ public class FunctionPool {
static { static {
final Constructor<String> constructor = ConstructorUtil.getConstructor(String.class, char[].class, boolean.class); final Constructor<String> 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 * @return String
*/ */
public static String createString(final char[] value) { 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);
}
} }
} }

View File

@ -24,6 +24,7 @@ import static java.lang.invoke.MethodType.methodType;
/** /**
* 以类似反射的方式动态创建Lambda在性能上有一定优势同时避免每次调用Lambda时创建匿名内部类 * 以类似反射的方式动态创建Lambda在性能上有一定优势同时避免每次调用Lambda时创建匿名内部类
* TODO JDK9+存在兼容问题
* *
* @author nasodaengineer * @author nasodaengineer
*/ */
@ -60,7 +61,8 @@ public class LambdaFactory {
} }
/** /**
* 构建Lambda * 根据提供的方法或构造对象构建对应的Lambda函数<br>
* 调用函数相当于执行对应的方法或构造
* *
* @param functionInterfaceType 接受Lambda的函数式接口类型 * @param functionInterfaceType 接受Lambda的函数式接口类型
* @param executable 方法对象支持构造器 * @param executable 方法对象支持构造器

View File

@ -1,14 +1,16 @@
package cn.hutool.core.reflect; package cn.hutool.core.reflect;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
/** /**
* 反射工具类 * 反射工具类
* *
* <p> * <p>
* 本工具类v6.x进行了重构原来{@link ReflectUtil}中的方法大部分被移动到了 * 本工具类v6.x进行了重构原来{@link ReflectUtil}中的方法大部分被移动到了
* {@link FieldUtil}{@link MethodUtil}{@link ModifierUtil}{@link ConstructorUtil}等中 * {@link FieldUtil}{@link MethodUtil}{@link ModifierUtil}{@link ConstructorUtil}等中
* 其他相关方法请参考<strong>cn.hutool.core.reflect</strong>包下的类,相关类 * 其他相关方法请参考<strong>cn.hutool.core.reflect</strong>包下的类,相关类
* </p> * </p>
* <p>常用方法变更</p> * <p>常用方法变更</p>
* <ul> * <ul>
@ -20,23 +22,28 @@ import java.lang.reflect.*;
* <li>{@code ReflectUtil.removeFinalModify(Field)} --p {@link ModifierUtil#removeFinalModify(Field)}</li> * <li>{@code ReflectUtil.removeFinalModify(Field)} --p {@link ModifierUtil#removeFinalModify(Field)}</li>
* </ul> * </ul>
* *
*
* @author Looly * @author Looly
* @since 3.0.9 * @since 3.0.9
*/ */
public class ReflectUtil { public class ReflectUtil {
/** /**
* 设置方法为可访问私有方法可以被外部调用 * 设置方法为可访问私有方法可以被外部调用<br>
* 注意此方法在jdk9+中抛出异常须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数
* *
* @param <T> AccessibleObject的子类比如ClassMethodField等 * @param <T> AccessibleObject的子类比如ClassMethodField等
* @param accessibleObject 可设置访问权限的对象比如ClassMethodField等 * @param accessibleObject 可设置访问权限的对象比如ClassMethodField等
* @return 被设置可访问的对象 * @return 被设置可访问的对象
* @throws SecurityException 访问被禁止抛出此异常
* @since 4.6.8 * @since 4.6.8
*/ */
public static <T extends AccessibleObject> T setAccessible(final T accessibleObject) { public static <T extends AccessibleObject> T setAccessible(final T accessibleObject) throws SecurityException {
if (null != accessibleObject && false == accessibleObject.isAccessible()) { if (null != accessibleObject && false == accessibleObject.isAccessible()) {
accessibleObject.setAccessible(true); return AccessController.doPrivileged((PrivilegedAction<T>) () -> {
// 特权访问
accessibleObject.setAccessible(true);
return accessibleObject;
});
} }
return accessibleObject; return accessibleObject;
} }

View File

@ -23,10 +23,6 @@ public class JdkUtil {
*/ */
public static final boolean IS_AT_LEAST_JDK17; public static final boolean IS_AT_LEAST_JDK17;
/**
* 是否GraalVM环境
*/
public static final boolean IS_GRAAL;
/** /**
* 是否Android环境 * 是否Android环境
*/ */
@ -40,7 +36,6 @@ public class JdkUtil {
// JVM名称 // JVM名称
final String jvmName = _getJvmName(); final String jvmName = _getJvmName();
IS_GRAAL = jvmName.equals("Substrate VM");
IS_ANDROID = jvmName.equals("Dalvik"); IS_ANDROID = jvmName.equals("Dalvik");
} }

View File

@ -1,6 +1,8 @@
package cn.hutool.core.util; package cn.hutool.core.util;
import cn.hutool.core.lang.Console;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
public class JdkUtilTest { public class JdkUtilTest {
@ -9,4 +11,10 @@ public class JdkUtilTest {
final int jvmVersion = JdkUtil.JVM_VERSION; final int jvmVersion = JdkUtil.JVM_VERSION;
Assert.assertTrue(jvmVersion >= 8); Assert.assertTrue(jvmVersion >= 8);
} }
@Test
@Ignore
public void getJvmNameTest() {
Console.log(JdkUtil.IS_AT_LEAST_JDK17);
}
} }