直接放代码:
Test.java:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.JFrame;
import sun.org.mozilla.javascript.internal.Context;
import sun.org.mozilla.javascript.internal.Scriptable;
public class Test
{
@org.junit.Test
public void test1()
{
Context cx = Context.enter();
try
{
Scriptable scope = cx.initStandardObjects();
String str = "3/(1+2)";
Object result = cx.evaluateString(scope, str, null, 1, null);
System.out.println(str + "=" + Context.toNumber(result));
}
finally
{
Context.exit();
}
}
@org.junit.Test
public void test2()
{
ScriptEngineManager factory = new ScriptEngineManager();
// create a JavaScript engine
ScriptEngine engine = factory.getEngineByName("JavaScript");
engine.put("a", 4);
engine.put("b", 6);
try
{
Object maxNum = engine.eval("function max_num(a,b){return (a>b)?a:b;}max_num(a,b);");
System.out.println("max_num:" + maxNum);
}
catch (Exception e)
{
e.printStackTrace();
}
}
@org.junit.Test
public void test3() throws FileNotFoundException, ScriptException, NoSuchMethodException
{
// 根据js的后缀名生成一个解析JS的脚本解析引擎
ScriptEngine engin = new ScriptEngineManager().getEngineByExtension("js");
// 查询一下这个引擎是否实现了下面很实用的接口
System.out.println(engin instanceof Invocable);
// 声明两个对象,传入到JS里面去
JFrame jf = new JFrame("test");
List list = new ArrayList();
// 得到挷定的键值对象,把当前的两个JAVA对象放进去
Bindings bind = engin.createBindings();
bind.put("jf", jf);
bind.put("list", list);
// 把挷下的键值对象放进去,作用域是当前引擎的范围
engin.setBindings(bind, ScriptContext.ENGINE_SCOPE);
// 用引擎执行一段写在JS文件里面的代码
Object obj = engin.eval(new FileReader("D:\\Javascript\\src\\test.js"));
// 这个时候返回值当然 是null了
System.out.println(obj);
// 把当前的引擎强制转为Invocable,这样就可以调用定义在JS文件里面的一个一个函数了
Invocable in = (Invocable) engin;
// 得到了从JS里面返回来的对象
List l = (List) in.invokeFunction("getNames");
System.out.println(l);
// 调用一下定义在JS里面的另一个函数
in.invokeFunction("testJS");
// 最后调用一个函数,该函数可以使我们前面定义的窗体显示出来
in.invokeFunction("doSth");
}
}
test.js文件:
function doSth()
{
jf.setSize(500,300);
jf.setVisible(true);
jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
}
function getNames()
{
list.add("doSth");
list.add("getNames");
return list;
}
function testJS()
{
print('Hello world!');
}