场景
我们经常需要从字符串中提取指定的值。
如果要设计一个平台,常见提取策略都要支持。从零实现起来会比较麻烦。
希望实现一个整合常见提取策略的工具,便于在各个场景复用。
开源地址
值提取系列
字符串值提取工具-04-java 调用 java? Janino 编译工具
场景
我们希望通过 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();
}
}
}
结果:
Hello, World
如何传入参数
我们如何传入参数呢?
我们希望参数是变化的,让 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();
}
}
}
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();
}
}
}
缺点
jdk11 开始不再支持。
网友评论