Java中執行JS指令碼
阿新 • • 發佈:2019-01-09
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