如何在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也能打印消息到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。