_haha.js
function doSth() {
jf.setSize(500, 300);
jf.setVisible(true);
jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
}
function getNames() {
list.add("张三");
list.add("李四");
list.add("王五");
return list;
}
function testJS() {
println('Hello world!');
}
package org.yla.jsr223;
public interface JSLib {
public int max_num(int a,int b);
}
package org.yla.jsr223;
import java.util.List;
import javax.crypto.spec.IvParameterSpec;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import org.junit.Test;
public class TestJSR223 {
/**
* 1 列出当前环境中支持的脚本引擎:
*/
@Test
public void testJSR223Get(){
//创建一个ScriptEngineManager管理器对象
ScriptEngineManager manager = new ScriptEngineManager();
//返回一个数组,该数组的元素是发现机制找到的所有 ScriptEngineFactory 类的实例
List<ScriptEngineFactory> engineFactories = manager.getEngineFactories();
for (ScriptEngineFactory scriptEngineFactory : engineFactories) {
System.out.println("enginename: "+scriptEngineFactory.getEngineName());
System.out.println("engine version: "+scriptEngineFactory.getEngineVersion());
System.out.println("language name: "+scriptEngineFactory.getLanguageName());
System.out.println("language version: "+scriptEngineFactory.getLanguageVersion());
System.out.println("mimetypes: "+scriptEngineFactory.getMimeTypes() );
System.out.println("extension: "+scriptEngineFactory.getExtensions());
}
}
/**
* 2 在Java中使用javascript的Hello world示例
*/
@Test
public void testSctiprEngineByHello(){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine =manager.getEngineByName("js");
String script ="print ('hello')";
try {
engine.eval(script);
} catch (ScriptException e) {
e.printStackTrace();
}
}
/**
* 3 传递变量
*/
@Test
public void TestPassaVariable(){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine =manager.getEngineByName("js");
engine.put("a", 4);
engine.put("b", 5);
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 (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 4 动态调用
*/
@Test
public void DynamicInvocation(){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine =manager.getEngineByName("js");
try {
engine.eval("function max_num(a,b){return (a>b)?a:b;}");
Invocable invoke =(Invocable) engine;
Object maxNum=invoke.invokeFunction("max_num", 4,10);
System.out.println(maxNum);
maxNum=invoke.invokeFunction("max_num", 111,33);
System.out.println(maxNum);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 5 动态实现接口
*/
@Test
public void DynamicInvocationImplementsInterface(){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine =manager.getEngineByName("js");
try {
engine.eval("function max_num(a,b){"
+ " return (a>b)?a:b;"
+ "}");
Invocable invoke =(Invocable) engine;
JSLib jsLib =invoke.getInterface(JSLib.class);
int maxNum =jsLib.max_num(33, 55);
System.out.println(maxNum);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 6 使用Java对象
*/
@Test
public void useJavaObject(){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine =manager.getEngineByName("js");
try {
Compilable compEngine =(Compilable) engine;
CompiledScript script =compEngine.compile("function max_num(a,b){ return (a>b)?a:b};");
script.eval();
Invocable invoke =(Invocable) engine;
Object maxNum = invoke.invokeFunction("max_num", 1231,123123);
System.out.println(maxNum);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package org.yla.jsr223;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.swing.JFrame;
import org.apache.commons.io.IOUtils;
public class TestExecJS {
public static void main(String[] args) throws Exception {
// 根据js的后缀名生成一个解析JS的脚本解析引擎
ScriptEngine engin = new ScriptEngineManager()
.getEngineByExtension("js");
// 查询一下这个引擎是否实现了下面很实用的接口
System.out.println("引擎是否实现了Invocable接口: "+(engin instanceof Invocable));
// 声明两个对象,传入到JS里面去
JFrame jf = new JFrame("Swing窗口标题展示:YangLnAn");
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(IOUtils.toString(ClassLoader.getSystemResource("org/yla/jsr223/_haha.js"),"UTF-8"));
// 这个时候返回值当然 是null了
System.out.println("打印Object对象: "+obj);
System.out.println("--------------------无节操下划线-----------------------------");
// 把当前的引擎强制转为Invocable,这样就可以调用定义在JS文件里面的一个一个函数了
Invocable in = (Invocable) engin;
// 得到了从JS里面返回来的对象
System.out.println("--------------------执行js里面的getName方法-----------------------------");
List l = (List) in.invokeFunction("getNames");
System.out.println("打印List对象: "+l);
// 调用一下定义在JS里面的另一个函数
System.out.println("--------------------执行js里面的testJs方法-----------------------------");
in.invokeFunction("testJS");
System.out.println("--------------------执行js里面的doSth方法-----------------------------");
// 最后调用一个函数,该函数可以使我们前面定义的窗体显示出来
System.out.println("---------------------显示swing窗口-----------------------------------");
in.invokeFunction("doSth");
}
}