diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a5013547..81759acf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,8 @@ * 【core 】 支持BeanUtil.toBean(object, Map.class)转换(issue#I1I4HC@Gitee) * 【core 】 MapUtil和CollUtil增加clear方法(issue#I1I4HC@Gitee) * 【core 】 增加FontUtil,可定义pressText是否从中间(issue#I1HSWU@Gitee) -* 【core 】 SoapClient支持自定义请求头(issue#I1I0AO@Gitee) +* 【http 】 SoapClient支持自定义请求头(issue#I1I0AO@Gitee) +* 【script 】 ScriptUtil增加evalInvocable和invoke方法(issue#I1HHCP@Gitee) ### Bug修复 * 【core 】 修复SimpleCache死锁问题(issue#I1HOKB@Gitee) diff --git a/hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java b/hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java index acf952944..7c3061dc1 100644 --- a/hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java +++ b/hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil; import javax.script.Bindings; import javax.script.Compilable; import javax.script.CompiledScript; +import javax.script.Invocable; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; @@ -28,7 +29,7 @@ public class ScriptUtil { * @return {@link ScriptEngine} 实例 */ public static ScriptEngine getScript(String nameOrExtOrMime) { - return CACHE.get(nameOrExtOrMime, ()-> createScript(nameOrExtOrMime)); + return CACHE.get(nameOrExtOrMime, () -> createScript(nameOrExtOrMime)); } /** @@ -149,6 +150,18 @@ public class ScriptUtil { return createScript("groovy"); } + /** + * 执行Javascript脚本,返回Invocable + * + * @param script 脚本内容 + * @return 执行结果 + * @throws ScriptRuntimeException 脚本异常 + * @since 5.3.6 + */ + public static Invocable evalInvocable(String script) throws ScriptRuntimeException { + return (Invocable) eval(script); + } + /** * 执行Javascript脚本 * @@ -199,6 +212,24 @@ public class ScriptUtil { } } + /** + * 执行JS脚本中的指定方法 + * + * @param script js脚本 + * @param func 方法名 + * @param args 方法参数 + * @return 结果 + * @since 5.3.6 + */ + public static Object invoke(String script, String func, Object... args) { + final Invocable eval = evalInvocable(script); + try { + return eval.invokeFunction(func, args); + } catch (ScriptException | NoSuchMethodException e) { + throw new ScriptRuntimeException(e); + } + } + /** * 编译Javascript脚本 *