java中js运用_Java中使用JavaScript脚本

简介 Nashorn

Nashorn 一个 javascript 引擎。

从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1规范以及一些扩展。

它使用基于JSR 292的新语言特性,其中包含在JDK 7中引入的 invokedynamic,将JavaScript编译成Java字节码。

与先前的Rhino实现相比,这带来了2到10倍的性能提升。

使用方式

编写JavaScript脚本

列:JavaScript方法使用Java对象执行方法获取返回值。

function scriptFunction(obj){

var a = 1;

var b = 2;

return obj.sum(a,b);

}

scriptFunction(obj);//调用该方法

该脚本变量定义为 String script1;

2. 创建JavaScript容器用户存储脚本 ScirptContainer.java

public class ScirptContainer {

public static ScriptEngine engine;//脚本引擎

static {

ScriptEngineManager manager = new ScriptEngineManager();//脚本引擎管理

engine = manager.getEngineByName("nashorn");//获取nashorn脚本引擎

engine.getContext().getWriter();//获取正文并且写入

}

private ConcurrentHashMap scripts = new ConcurrentHashMap<>();//脚本存储容器

public CompiledScript getCompiledScript(String script) throws ScriptException{

//判断脚本是否为空

if(script == null || "".equals(script)){

throw new ScriptException("JavaScript empty");

}

//获取脚本Hash

int hashCode = script.hashCode();

//从容器中获取脚本

CompiledScript compiledScript = scripts.get(hashCode);

if(compiledScript == null){

//容器中无脚本创建脚本对象

Compilable compilable = (Compilable) engine;

//编译JavaScript脚本

compiledScript = compilable.compile(script);

//脚本对象存入容器中

scripts.put(hashCode, compiledScript);

}

return compiledScript;

}

}

Java执行JavaScript脚本

public class ScriptHandler {

//创建容器对象

private ScirptContainer scirptContainer = new ScirptContainer();

//需要执行的对象

String js1 = "function scriptFunction(obj){ var a = 1; var b = 2; return obj.sum(a,b); } scriptFunction(obj);";

@Test

public void test() throws ScriptException{

//获取脚本对象

CompiledScript c1 = scirptContainer.getCompiledScript(js1);

//创建参数绑定

Bindings bindings = scirptContainer.engine.createBindings();

//obj参数绑定SumTest类

bindings.put("obj", new SumTest());

//执行JavaScript脚本并且打印返回值

System.out.println(c1.eval(bindings));

}

}

注意事项:

脚本中scriptFunction(obj);是必须存在,否则不会执行方法.

脚本中可以创建Java对象,需要全类名如var map = new java.util.HashMap();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值