This commit is contained in:
Looly
2020-09-28 19:27:57 +08:00
parent d775ce9cca
commit 80f85390e4
6 changed files with 127 additions and 74 deletions

View File

@@ -151,7 +151,12 @@ public class ScriptUtil {
}
/**
* 执行Javascript脚本返回Invocable
* 执行Javascript脚本返回Invocable,此方法分为两种情况:
*
* <ol>
* <li>执行的脚本返回值是可执行的脚本方法</li>
* <li>脚本为函数库则ScriptEngine本身为可执行方法</li>
* </ol>
*
* @param script 脚本内容
* @return 执行结果
@@ -159,11 +164,23 @@ public class ScriptUtil {
* @since 5.3.6
*/
public static Invocable evalInvocable(String script) throws ScriptRuntimeException {
return (Invocable) eval(script);
final ScriptEngine jsEngine = getJsEngine();
final Object eval;
try {
eval = jsEngine.eval(script);
} catch (ScriptException e) {
throw new ScriptRuntimeException(e);
}
if(eval instanceof Invocable){
return (Invocable)eval;
} else if(jsEngine instanceof Invocable){
return (Invocable)jsEngine;
}
throw new ScriptRuntimeException("Script is not invocable !");
}
/**
* 执行Javascript脚本
* 执行有返回值的Javascript脚本
*
* @param script 脚本内容
* @return 执行结果
@@ -179,7 +196,7 @@ public class ScriptUtil {
}
/**
* 执行脚本
* 执行有返回值的脚本
*
* @param script 脚本内容
* @param context 脚本上下文
@@ -196,7 +213,7 @@ public class ScriptUtil {
}
/**
* 执行脚本
* 执行有返回值的脚本
*
* @param script 脚本内容
* @param bindings 绑定的参数

View File

@@ -0,0 +1,22 @@
package cn.hutool.script.test;
import cn.hutool.core.io.resource.ResourceUtil;
import org.junit.Assert;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class NashornDeepTest {
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
engine.eval(ResourceUtil.readUtf8Str("filter1.js"));
final Object filter1 = ((Invocable) engine).invokeFunction("filter1", 1, 2);
Assert.assertFalse((Boolean) filter1);
}
}

View File

@@ -1,7 +1,9 @@
package cn.hutool.script.test;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.script.ScriptRuntimeException;
import cn.hutool.script.ScriptUtil;
import org.junit.Assert;
import org.junit.Test;
import javax.script.CompiledScript;
@@ -31,6 +33,12 @@ public class ScriptUtilTest {
ScriptUtil.eval("print('Script test!');");
}
@Test
public void invokeTest() {
final Object result = ScriptUtil.invoke(ResourceUtil.readUtf8Str("filter1.js"), "filter1", 2, 1);
Assert.assertTrue((Boolean) result);
}
@Test
public void pythonTest() throws ScriptException {
final ScriptEngine pythonEngine = ScriptUtil.getPythonEngine();

View File

@@ -0,0 +1,6 @@
function filter1(a, b) {
if (a > b) {
return a > b;
}
return false;
}