实现的功能
- java构建js执行环境
- java调用js函数,传参数
- js调用java静态方法,静态变量
- js创建java对象
- js导入java包,实现更多可扩展功能,导包的方式有两种,分别看test.js和test_2.js
- java定义接口,js来实现java接口
上代码
JS.java
package com.js;
import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class JS {
ScriptEngineManager engineManager = null;
ScriptEngine engine = null;
Invocable invocable = null;
private void init(){
engineManager = new ScriptEngineManager();;
engine = engineManager.getEngineByName("JavaScript");
invocable = (Invocable) engine;
}
public JS(){
this.init();
}
public Object eval(String script){
try {
return this.engine.eval(script);
} catch (ScriptException e) {
e.printStackTrace();
}
return null;
}
public Object invokeFunction(String name,Object... args){
try {
return invocable.invokeFunction(name, args);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public Object toJsObj(Object obj){
return this.eval("("+JSONObject.toJSONString(obj)+")");
}
public <T> T getInterfase(Class<T> clz){
return (T) invocable.getInterface(clz);
}
public void bind(String var,Object obj){
Bindings bindings = engine.getBindings(ScriptContext.GLOBAL_SCOPE);
bindings.put(var, obj);
}
}
JSLib.java
package com.js;
public interface JSLib {
public String render(Object value,Object display,Object obj);
}
ScriptTest.java
package com.js;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
public class ScriptTest{
public static String NAME = "SCRIPT_TEST";
@Test
public void test() throws Exception {
String testJs = this.getText("test_2.js");
JS js = new JS();
js.eval(testJs);
Object rs = js.invokeFunction("test", "as");
System.out.println(rs);
rs = js.invokeFunction("javaName");
System.out.println(rs);
rs = js.invokeFunction("testBean");
System.out.println(rs);
rs = js.invokeFunction("println","sssskk");
rs = js.invokeFunction("createObj");
js.bind("myTest", new ScriptTest());
js.invokeFunction("bindTest");
rs = js.invokeFunction("importPackageTest");
System.out.println(rs);
JSLib jsLib = js.getInterfase(JSLib.class);
Map<String, Object> item = new HashMap<String, Object>();
item.put("id", "123");
item.put("name", "张三");
rs = jsLib.render("1", null, js.toJsObj(item));
System.out.println(rs);
}
public static String run(){
System.out.println("runn");
return "runname";
}
public void ok(String s){
System.out.println(s+":ok");
}
public String getText(String fileName) throws Exception{
BufferedReader reader = this.getReader(fileName);
StringBuffer s = new StringBuffer();
String line = null;
while((line = reader.readLine()) != null){
s.append(line+"\n");
}
reader.close();
return s.toString();
}
//获取文本文件流
public BufferedReader getReader(String fileName) throws Exception{
return new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(fileName)));
}
}
test.js
var app = JavaImporter();
app.importPackage(Packages.com.js);
function test(a){
return a+":hello";
}
function javaName(){
return com.js.ScriptTest.NAME;
}
function testBean(){
return com.js.ScriptTest.run();
}
function createObj(){
var obj = new com.js.ScriptTest();
obj.ok("createObj");
}
function bindTest(){
myTest.ok("bind");
myTest.run();
}
function importPackageTest(){
with(app){
return ScriptTest.NAME;
}
}
function render(value,display,obj){
return "render:"+value+",name="+obj.name;
}
test_2.js
importPackage(com.qssh.base.test.init);
function test(a){
return a+":hello";
}
function javaName(){
return com.qssh.base.test.init.ScriptTest.NAME;
}
function testBean(){
return com.qssh.base.test.init.ScriptTest.run();
}
function createObj(){
var obj = new com.qssh.base.test.init.ScriptTest();
obj.ok("createObj");
}
function bindTest(){
myTest.ok("bind");
myTest.run();
}
function importPackageTest(){
return ScriptTest.NAME;
}
function render(value,display,obj){
return "render:"+value+",name="+obj.name;
}