MangoCool

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

分享:

上一篇rm: cannot remove `xxx': Operation not permitted

下一篇基于Hbase的Spark Sql简单示例

关于我

崇尚极简,热爱技术,喜欢唱歌,热衷旅行,爱好电子产品的一介码农。

座右铭

当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!

人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。

Copyright 2015- 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号

免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。