1. 程式人生 > >Java中執行JS指令碼

Java中執行JS指令碼

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