场景

我们经常需要从字符串中提取指定的值。

如果要设计一个平台,常见提取策略都要支持。从零实现起来会比较麻烦。

希望实现一个整合常见提取策略的工具,便于在各个场景复用。

开源地址

 value-extraction 值提取核心

值提取系列

 字符串值提取工具-01-概览

 字符串值提取工具-02-java 调用 js

 字符串值提取工具-03-java 调用 groovy

 字符串值提取工具-04-java 调用 java? Janino 编译工具

 字符串值提取工具-05-java 调用 shell

 字符串值提取工具-06-java 调用 python

 字符串值提取工具-07-java 调用 go

场景

我们希望通过 java 执行 js,如何实现呢?

java 调用 js

package org.example;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JavaCallJsDemo {

    public static void main(String[] args) {
        // 创建一个脚本引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();

        // 获取一个 JavaScript 引擎实例
        ScriptEngine engine = manager.getEngineByName("JavaScript");

        // 定义一个 JavaScript 脚本
        String script = "function greet(name) { return 'Hello, ' + name; } greet('World');";

        try {
            // 执行 JavaScript 脚本
            Object result = engine.eval(script);

            // 输出执行结果
            System.out.println(result);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.

结果:

Hello, World
  • 1.

如何传入参数

我们如何传入参数呢?

我们希望参数是变化的,让 js 执行对应的脚本方法

代码

package org.example;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JavaCallJsWithArgsDemo {

    public static void main(String[] args) {
        // 创建一个脚本引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();

        // 获取一个 JavaScript 引擎实例
        ScriptEngine engine = manager.getEngineByName("JavaScript");

        // 定义一个 JavaScript 脚本
        String script = "function greet(name) { return 'Hello, ' + name; }";

        try {
            // 执行 JavaScript 脚本,定义函数
            engine.eval(script);

            // 创建Invocable实例
            Invocable invocable = (Invocable) engine;

            // 调用 JavaScript 函数并传递参数
            String result = (String) invocable.invokeFunction("greet", "World");

            // 输出执行结果
            System.out.println(result);
        } catch (ScriptException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

nashorn 方案

jdk8 开始支持。

传入参数

package com.github.houbb.value.extraction.test.js;

import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JavaScriptExample {

    public static void main(String[] args) {
        // 创建脚本引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();

        // 获取 JavaScript 引擎
        ScriptEngine engine = manager.getEngineByName("nashorn");

        // 创建绑定并设置参数
        Bindings bindings = engine.createBindings();
        bindings.put("name", "Alice");
        bindings.put("age", 30);

        // 定义 JavaScript 脚本
        String script = "var greeting = 'Hello, ' + name + '! You are ' + age + ' years old.'; greeting;";

        try {
            // 执行脚本并传递参数
            Object result = engine.eval(script, bindings);
            System.out.println(result);  // 输出结果
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.

缺点

jdk11 开始不再支持。