Java执行Javascript代码
2018-03-21 14:28:32
998 次阅读
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
相关话题
- JAVA 原生异步执行方法CompletableFuture
- Apache Commons JEXL实现字符串转换成可执行代码
- javascript判断上传的文件是否为图片
- TS打包报错JavaScript heap out of memory
- kindeditor编辑框插入程序代码时突出显示
- JS执行耗时任务Loading效果
- 解决kindeditor中onkeydown不执行的问题
- Spring Boot启动时执行指定方法
- Java排序算法
- Java制作字符动画
- Java中文算数验证码
- java中String 分割特殊符号"." "|" "*" "\" "]"
- Java两种文件复制方式
- Java匿名内部类赋值给外部参数
- java删除字符串中的数字