前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Java 中使用 JavaScript Nashorn 引擎

Java 中使用 JavaScript Nashorn 引擎

作者头像
kongxx
发布2024-10-10 12:46:04
发布2024-10-10 12:46:04
17600
代码可运行
举报
运行总次数:0
代码可运行

Nashorn 介绍

Nashorn 是 Java 8 中引入的 JavaScript 引擎,它允许在 Java 应用程序中嵌入和执行 JavaScript 代码。但是在JDK 15 中,Nashorn 已经被移除,取而代之的是新的 JavaScript 引擎,即 GraalJS。如果要继续使用 Nashorn,需要引入相应的依赖。

代码语言:javascript
代码运行次数:0
复制
<dependency>
  <groupId>org.openjdk.nashorn</groupId>
  <artifactId>nashorn-core</artifactId>
  <version>15.0</version>
</dependency>

hello world

准备javascript文件,内容如下:

代码语言:javascript
代码运行次数:0
复制
var greeting='hello world';
print(greeting);

在Java 中使用 Nashorn 引擎执行这个文件:

代码语言:javascript
代码运行次数:0
复制
import org.apache.commons.io.FileUtils;

import javax.script.*;
import java.io.File;

public class TestNashorn {

    public static void main( String args[] ) throws Exception {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("Nashorn");

        String content = FileUtils.readFileToString(new File(TestNashorn.class.getResource("test.js").getFile()), "UTF-8");
        Object result = engine.eval(content);
        System.out.println("result: " + result);
    }
}

传递参数

准备javascript文件,内容如下:

代码语言:javascript
代码运行次数:0
复制
var greeting='hello ' + name;
print(greeting);
greeting

javascript 中使用了一个变量name,最后返回了greeting。

在Java 中使用 Nashorn 引擎执行这个文件,其中使用 Bindings 传递了name参数,然后获取返回值:

代码语言:javascript
代码运行次数:0
复制
import org.apache.commons.io.FileUtils;

import javax.script.*;
import java.io.File;

public class TestNashorn {

    public static void main( String args[] ) throws Exception {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("Nashorn");
        
        Bindings bind = engine.getBindings(ScriptContext.ENGINE_SCOPE);
        bind.put("name", "kongxx");
        String content = FileUtils.readFileToString(new File(TestNashorn.class.getResource("greeting.js").getFile()), "UTF-8");
        Object result = engine.eval(content);
        System.out.println("result: " + result);
    }
}

调用 Java 类和方法

准备javascript文件,其中调用了 Java 中的 Calendar 类,内容如下:

代码语言:javascript
代码运行次数:0
复制
load('nashorn:mozilla_compat.js');
//importPackage(Packages.java.util);
importClass(java.util.Calendar);

var cal = Calendar.getInstance();
var time = cal.getTimeInMillis();
print(time);
time

在Java 中使用 Nashorn 引擎执行这个文件,然后获取返回值:

代码语言:javascript
代码运行次数:0
复制
import org.apache.commons.io.FileUtils;

import javax.script.*;
import java.io.File;

public class TestNashorn {

    public static void main( String args[] ) throws Exception {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("Nashorn");
        
        Bindings bind = engine.getBindings(ScriptContext.ENGINE_SCOPE);
        String content = FileUtils.readFileToString(new File(TestNashorn.class.getResource("javaclass.js").getFile()), "UTF-8");
        Object result = engine.eval(content);
        
        System.out.println("result: " + result);
    }
}

调用 JavaScript 函数

准备javascript文件,其中定义了两个函数,内容如下:

代码语言:javascript
代码运行次数:0
复制
var func1 = function() {
    return 'hello world';
}

var func2 = function(name) {
    return 'hello '+ name;
}

在Java 中使用 Nashorn 引擎执行这个文件,其中使用 Invocable 调用函数,并获取返回值:

代码语言:javascript
代码运行次数:0
复制
import org.apache.commons.io.FileUtils;

import javax.script.*;
import java.io.File;

public class TestNashorn {

    public static void main( String args[] ) throws Exception {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("Nashorn");

        String content = FileUtils.readFileToString(new File(TestNashorn.class.getResource("function.js").getFile()), "UTF-8");
        engine.eval(content);
        
        Invocable invocable = (Invocable)engine;

        Object result1 = invocable.invokeFunction("func1");
        System.out.println("result: " + result1);

        Object result2 = invocable.invokeFunction("func2", "kongxx");
        System.out.println("result: " + result2);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Nashorn 介绍
  • hello world
  • 传递参数
  • 调用 Java 类和方法
  • 调用 JavaScript 函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档