Java执行Javascript代码

2018-03-21 14:28:32
793次阅读
0个评论

1.首先把js代码写在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
}

2.在java中定义一个接口,这个接口要有一个与要执行的javascript函数一样的方法签名。定义个Methods接口,内容如下:


package js;

/**
 * 接口中的方法签名必须与要执行的JavaScript方法一致
 */
public interface Methods {
    public String encodeInp(String input);
}

3.执行方法


package js;

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

public class ExecuteScript {
    public static void main(String[] args) {
        //创建一个脚本引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();
        //获取一个指定的名称的脚本引擎
        ScriptEngine engine = manager.getEngineByName("js");
        try {
            //获取当前类的所在目录的路径
            String path = ExecuteScript.class.getResource("").getPath();
            // FileReader的参数为所要执行的js文件的路径
            engine.eval(new FileReader(path + "conwork.js"));
            if (engine instanceof Invocable) {
                Invocable invocable = (Invocable) engine;
                //从脚本引擎中返回一个给定接口的实现
                Methods executeMethod = invocable.getInterface(Methods.class);
                //执行指定的js方法
                System.out.println(executeMethod.encodeInp("14142400755"));//
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
通过上面代码,我们每需要执行一个新的js方法就重复写第三步的代码,存在重复操作,我们完全可以把它抽取成通用的方法,这样我们只要给定一个指定的方法接口,就可以获得一个方法的实例


package js;

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

public class ExecuteScript {
    /**
     * 从给定的js文件中获取指定接口中的方法的实例
     * @param fileLoacation js文件路径
     * @param clazz 接口的class
     * @return 返回一个指定接口方法的实例
     */
    public <T> T getMethod (String fileLoacation,Class<T> clazz) {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        try {
            String path = ExecuteScript.class.getResource("").getPath();
            System.out.println(path);
            // FileReader的参数为所要执行的js文件的路径
            engine.eval(new FileReader(fileLoacation));
            if (engine instanceof Invocable) {
                Invocable invocable = (Invocable) engine;
                T executeMethod = invocable.getInterface(clazz);
                return executeMethod;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
测试用例:


package js;

/**
 * 
 */
public class Main {
    public static void main(String args[]){
        ExecuteScript executeScript = new ExecuteScript();
        String path=Main.class.getResource("").getPath();
        String fileLocation=path + "conwork.js";
        //通过下面一行代码就可以获取指定接口中方法的实例
        Methods method = executeScript.getMethod(fileLocation, Methods.class);
        String result=method.encodeInp("14142400755");
        System.out.println(result);

    }

}





收藏00

登录 后评论。没有帐号? 注册 一个。