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

猜你喜欢

转载自blog.csdn.net/D578332749/article/details/84867219
今日推荐