如何在java中运行 js 代码呢? 答案是 javax.script 。

java自1.6开始, 基于JSR223 请求规范提供了对于脚本语言的支持,对应的包是 javax.script。

简单的代码调用示例:

public class Test {

    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager engineManager = new ScriptEngineManager();
        ScriptEngine engine = engineManager.getEngineByName("js");
        engine.eval("print('Hello Js!')");
    }
}

执行结果。

java 如何运行JS文件 java运行js代码_js

那么为什么我们要在java中使用js代码呢? 明明java也能打印消息到console啊。难道还有一些java不好做的事情?

没错我们之所以在java中使用脚本语言殷勤来运行代码,是为了实现一些java不方便或者不好做的事情。

举个例子,有两个数字, 我需要比较他们的大小, 并输出结果。但是比较的规则是不确定的, 也就是 运算符 不确定。如果我们要实现这样的功能, 简单的做法是 我们需要枚举几个常量作为 运算符的 标志。
如:

/**
* Operator 就是我们的枚举类
*/
 public boolean calculate(int i1 , int i2, Operator operator ) {
	switch(operator) {
		case Operator.EQUAL : 
			return i1 = i2 ;
		case Operator.GREATER_THAN : 
			return i1 > i2 ;
		// Omit other case!
		default :
			return false;
	}
}

这样的话我们可能需要写好多的case语句(此处忽略了很多case语句)。 那如果使用 js 语言来书写呢? 由于 在java中运行脚本语言是通过 字符串拼装的, 一切将变得更加的简单。

代码如下

/**
* 以工具类的形式声明静态变量并通过调用静态方法,将使得我们的方法调用更加的简单
*/
public class JsEngine {
	private static ScriptEngineManager engineManager = new ScriptEngineManager();
    private static ScriptEngine engine = engineManager.getEngineByName("js");
	
	public static boolean compare(int i1, String operator, int i2) {
        operator = " " + operator + " ";
        try {
            Object result = engine.eval(i1 + operator + i2);
            return (boolean) result;
        } catch (ScriptException e) {
            return false;
        }
    }

    /**
     * 实际调用
     * @param args
     */
    public static void main(String[] args) {
        boolean b = JsEngine.compare(3, ">", 2);
        System.out.println(" 1 > 2 ? " + b);
    }
}

在上述的代码中,我们可以看到,将运算语句以字符串的形式拼装,并交由js引擎运行以获得结果,也能够实现。特别是我们将他封装成工具类后,调用时非常简单的,当然这个工具 同样有个一问题,如果不适用枚举类规定运算符的内容, 如果调用者输入了错误的运算符, 将得到错误的结果。

相对的,通过js引擎运行在获得结果,在做一些简单的操作时将损失更多的性能。如无必要,并不是非常推荐。

当然,如果你遇到了一个java非常难以表达的运算逻辑的话, 不妨试试 javax.script。