关于java代码中执行js脚本

应用场景:java语言是静态语言,执行时需要预编译。所以在一些需求变换比较频繁的时候使用起来就不是特别方便了。并且本人在用数据库的存储过程的时候也遇到了每个客户的需求不一致,导致需要频繁的修改存储过程里面的代码,所以想着有什么方法能有解决这个问题。经过本人找寻资料总结代码如下:

一、先编写一个js脚本信息 

function encodeInp(input){
	var s="js文件输出:"+input;
	return s;
}

 二、首先要创建一个js函数对应的接口,来映射js函数

public interface JSMethods {

    String encodeInp(String input);

}

三、加载js文件,并且将文件映射到接口上 

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.FileNotFoundException;
import java.io.FileReader;

/**
 * @author lihao
 * @create 2022-08-30 9:47
 * @desc
 **/
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"));
        engine.eval(new FileReader(jsName));
        //从脚本引擎中返回一个给定接口的实现
        Invocable invocable = (Invocable) engine;
        return invocable.getInterface(clazz);
    }


    public static void main(String[] args) {
        try {
            JavaScriptProvider<JSMethods> jsProvider = new JavaScriptProvider<>();
            JSMethods jsMethods = jsProvider.loadJs("C:\\Users\\Administrator\\Desktop\\config.js",JSMethods.class);
            System.out.println(jsMethods.encodeInp("123"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ScriptException e) {
            e.printStackTrace();
        }

    }

}

运行结果:

posted @ 2022-08-30 17:06  阿昊qaq  阅读(269)  评论(0)    收藏  举报  来源