我的第一个java运行js代码的简单示例
2015-08-10 10:44:04 作者:MangoCool 来源:MangoCool
因为业务需要,需要用java来执行自定义的js代码的计算模型。幸好jdk6以后,jdk就增加了执行js代码的引擎。good luck!废话不多说,开始我们最简单的示例,示例展示的是自定义函数的嵌套。
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class javaTestJs {
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");//也可以将javascript改成js
try{
runJs(engine, 2.0, 400.0);
} catch(ScriptException e){
e.printStackTrace();
} catch (NoSuchMethodException e2){
e2.printStackTrace();
}
}
public static void runJs(ScriptEngine engine, double M3_FN, double M3_fh1)
throws ScriptException, NoSuchMethodException
{
String script = "function f1(a){ return a*10;}";
engine.eval(script);
Invocable inv = (Invocable) engine;
Object obj = inv.invokeFunction("f1", 2);//f1是方法名,2是实参
System.out.println(obj);
String js = "function f2(){ var a=0; var b="+M3_FN+"*"+obj+"/3600; if("+M3_fh1+">=50){ a="+M3_fh1+"+b;} return a;}";
System.out.println(js);
engine.eval(js);
Object obj2 = inv.invokeFunction("f2");
System.out.println(obj2);
}
}
执行结果:
20.0
function f2(){ var a=0; var b=2.0*20.0/3600; if(400.0>=50){ a=400.0+b;} return a;}
400.0111111111111
经改进,runJs方法还可以更加帅气哦。
public static void runJs(ScriptEngine engine, double M3_FN, double M3_fh1)
throws ScriptException, NoSuchMethodException
{
String script = "function f1(a){ return a*10;}";
engine.eval(script);
Invocable inv = (Invocable) engine;
String js = "function f2(){ var a=0; var b="+M3_FN+"*f1(2)/3600; if("+M3_fh1+">=50){ a="+M3_fh1+"+b;} return a;}";
engine.eval(js);
Object obj2 = inv.invokeFunction("f2");
System.out.println(obj2);
}
至此示例结束!因为示例比较简单,就不做解说了,cp到自己的工程就可以直接运行了。
有不对或是不完善地方请多多指正以及多多谅解!
编写代码过程中,出现过一次异常:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: invalid return (#1) in at line number 1
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:224)
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:240)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
at javaTestJs.runJs(javaTestJs.java:39)
at javaTestJs.main(javaTestJs.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: sun.org.mozilla.javascript.internal.EvaluatorException: invalid return (#1)
at sun.org.mozilla.javascript.internal.DefaultErrorReporter.runtimeError(DefaultErrorReporter.java:109)
at sun.org.mozilla.javascript.internal.DefaultErrorReporter.error(DefaultErrorReporter.java:96)
at sun.org.mozilla.javascript.internal.Parser.addError(Parser.java:232)
at sun.org.mozilla.javascript.internal.Parser.addError(Parser.java:210)
at sun.org.mozilla.javascript.internal.Parser.reportError(Parser.java:267)
at sun.org.mozilla.javascript.internal.Parser.reportError(Parser.java:254)
at sun.org.mozilla.javascript.internal.Parser.reportError(Parser.java:247)
at sun.org.mozilla.javascript.internal.Parser.returnOrYield(Parser.java:1670)
at sun.org.mozilla.javascript.internal.Parser.statementHelper(Parser.java:1043)
at sun.org.mozilla.javascript.internal.Parser.statement(Parser.java:945)
at sun.org.mozilla.javascript.internal.Parser.parse(Parser.java:570)
at sun.org.mozilla.javascript.internal.Parser.parse(Parser.java:532)
at sun.org.mozilla.javascript.internal.Context.compileImpl(Context.java:2438)
at sun.org.mozilla.javascript.internal.Context.compileReader(Context.java:1355)
at sun.org.mozilla.javascript.internal.Context.compileReader(Context.java:1327)
at sun.org.mozilla.javascript.internal.Context.evaluateReader(Context.java:1166)
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:214)
... 9 more
这是因为我之前31行的代码是这样的:
String js = "var a=0; var b="+M3_FN+"*"+obj+"/3600; if("+M3_fh1+">=50){ a="+M3_fh1+"+b;} return a;";
根据异常来看,意思是这段代码的return是无效的,因为本段代码不是一个函数,所以并不能return。
分享: