Java是静态语言,需要经过预先编译,所以在一些需求变动比较频繁的场景,使用起来很不方便,这个时候如果我们引入脚本来实现变动频繁的需求,就会很爽了。
本文为在网友的文章基础上整理,记录在Java中执行JavaScript的方法,以此备忘。
我们要执行的JavaScript脚本conwork.js:
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function encodeInp(input) {
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
do {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64
} else if (isNaN(chr3)) {
enc4 = 64
}
output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
chr1 = chr2 = chr3 = "";
enc1 = enc2 = enc3 = enc4 = ""
} while (i < input.length);
return output
}
首先我们需要创建一个和js函数对应的接口,用来映射js函数:
public interface JSMethods {
public String encodeInp(String input);
}
加载js文件,并将js函数映射到java接口:
package com.baymax.study;
import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class JavaScriptProvider<T> {
public T loadJS(String jsName, Class<T> clazz) throws FileNotFoundException, ScriptException {
// 创建一个脚本引擎管理器
ScriptEngineManager manager = new ScriptEngineManager();
// 获取一个指定的名称的脚本引擎
ScriptEngine engine = manager.getEngineByName("js");
// 获取js文件所在目录的路径
String path = JavaScriptProvider.class.getResource("").getPath()+"/js/";
engine.eval(new FileReader(path + jsName + ".js"));
// 从脚本引擎中返回一个给定接口的实现
Invocable invocable = (Invocable) engine;
return invocable.getInterface(clazz);
}
}
main进行测试:
public static void main(String[] args) {
try {
JavaScriptProvider<JSMethods> jsProvider = new JavaScriptProvider<>();
JSMethods jsMethods = jsProvider.loadJS("conwork", JSMethods.class);
System.out.println(jsMethods.encodeInp("14142400755"));
} catch (Exception e) {
e.printStackTrace();
}
}
原文地址:https://blog.csdn.net/qq_1017097573/article/details/74157003#commentBox