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;
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<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
*/
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时创建匿名内部类
* TODO JDK9+存在兼容问题
*
* @author nasodaengineer
*/
@ -60,7 +61,8 @@ public class LambdaFactory {
}
/**
* 构建Lambda
* 根据提供的方法或构造对象构建对应的Lambda函数<br>
* 调用函数相当于执行对应的方法或构造
*
* @param functionInterfaceType 接受Lambda的函数式接口类型
* @param executable 方法对象支持构造器

View File

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

View File

@ -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");
}

View File

@ -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);
}
}