java第一个运行代码_我的第一个java运行js代码的简单示例

我的第一个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。

分享:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值