因为业务需要,需要用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 (<Unknown source>#1) in <Unknown source> 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 (<Unknown source>#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。
标签: java javascript demo
分享:
崇尚极简,热爱技术,喜欢唱歌,热衷旅行,爱好电子产品的一介码农。
联系QQ:58742094
联系电话:
工作邮箱:
当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!
人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。
Copyright 2015- 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号
免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。