java8 JavaScript引擎 Nashorn
所属分类 java
浏览量 285
Nashorn, JavaScript 引擎 在JVM上运行javascript 代码
Nashorn Java虚拟机JavaScript引擎 ,Nashorn于2014年在jdk8中首次亮相,
提高了Java和JavaScript之间的兼容性,同时提供了性能优势。
但是随着ECMAScript语言标准的快速发展,维护Nashorn引擎变得越发挑战,因此该引擎将在Java中废弃。
Java11 声明弃用Nashorn JavaScript脚本引擎,相关API和jjs工具,并在未来的版本中移除这些特性。
import javax.script.*;
public class JsDemo {
public static void main(String[]args)throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
Object result = null;
String script = "var data = {\"name\":\"tiger\"};\n data;";
result = engine.eval(script);
// class jdk.nashorn.api.scripting.ScriptObjectMirror#[object Object]
printResult(result);
script = "var data = {\"name\":\"tiger\"};\n data.name;";
result = engine.eval(script);
// class java.lang.String#tiger
printResult(result);
Bindings binding = engine.createBindings();
RunContext context = new RunContext();
// js脚本中 可直接引用 context ,调用相关方法
binding.put("context",context);
script = "context.getId();";
result = engine.eval(script,binding);
// class java.lang.Long#1
printResult(result);
try {
result = engine.eval(script);
printResult(result);
}catch(Exception e){
// 没有 binding ,脚本里使用 context 报错
// javax.script.ScriptException: TypeError: context.getId is not a function in at line number 1
System.out.println(e);
}
//
script = "var util = Java.type('dyyx.util.CommUtil');util.getNowTimeStr();";
result = engine.eval(script);
// 使用 java中的类 ,可以调用静态方法
// class java.lang.String#2024-01-16T13:34:43.063
printResult(result);
script = "var util = Java.type('dyyx.util.CommUtil');" +
"var Date = Java.type('java.util.Date');" +
"var now = new Date();" +
"util.formatDate(now,'yyyy-mm-dd');";
result = engine.eval(script);
// class java.lang.String#2024-34-16
printResult(result);
CompiledScript compliedScript = null;
// 编译后执行
compliedScript = ((Compilable)engine).compile(script);
// jdk.nashorn.api.scripting.NashornScriptEngine$3@4278a03f
System.out.println(compliedScript.toString());
// jdk.nashorn.api.scripting.NashornScriptEngine@147ed70f
System.out.println(compliedScript.getEngine().toString());
// class java.lang.String#2024-43-16
result = compliedScript.eval(binding);
printResult(result);
}
public static void printResult(Object result){
if(result == null){
System.out.println(result == null);
}else{
System.out.println(result.getClass()+"#"+result);
}
}
}
java CommUtil
public static String getNowTimeStr(){
return LocalDateTime.now().toString();
}
public static String formatDate(Date date, String format){
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}
上一篇
下一篇
vertx verticle 实例
vertx verticle 部署和卸载
项目和产品技术栈
javascript 字符串相等判断
javascript 实用代码
ehcache 例子