这两天公司有一个需求,将一段加密的JavaScript代码转换为JAVA版。
JavaScript中的某一段代码:
前期查看了整个JavaScript代码,发现代码中,方法里面嵌套方法,各种不合规的变量名,导致开始就怀疑到底是否能够翻译成功,很想放弃
中期决定按照整个JavaScript的代码结构,重头开始翻译。
后期完成对整个JavaScript的翻译,编写测试方法,结合Java调试和JavaScript调试,让两个语言的测试结果达到一致
总结Java与JavaScript中差异:
1。JavaScript中if判断的条件可以不是boolean类型,对于int的类型,非0就是true,0就是false。既Java中可以通过 int a = 1; if(a!=0) 来代替Javascript中的if(a)
2。JavaScript中的parseInt("12",10)对应Java的Integer.parseInt("12",10)方法
3。JavaScript获得数值的二进制: str1.charAt(i).charCodeAt().toString(2)
Java中获得数值的二进制:Integer.toBinaryString((int)str1.charAt(i))
4。JavaScript中直接在空白处调用函数初始化,Java中必须定义在static块中进行初始化
5。JavaScript中String.fromCharCode获得数值对应的Unicode字符,Java中通过Character.toChars()获得数组,不过传入的是一个数组,所以需要转换成字符串,通过String.valueOf()方法
6。JavaScript中的Math.ceil(bits/bpe)函数,bits/bpe如果除不尽会有小数,但是在JAVA中两个整数相除不会有小数(余数),所以需要把其中一参数改成double类型再进行相除,Math.ceil(((double) bits / bpe)
JS函数:
改造后的Java函数:
第二种方案构思:
通过Java的第三方支持或者Jar调用JavaScript函数实现:
大致思路:1。读取JavaScript文件,2。构建JavaScript环境(类似于浏览器编译脚本),3。执行函数返回结果。
private static final String JS_FILE_PATH = "D:\xxxxx.js"; // 读取js文件 private static final ScriptEngineManager manager = new ScriptEngineManager(); private static final String ENCRYPT_METHOD = "EncryptAPin"; public static String encrypt(String pwd){ FileReader reader = null; try { ScriptEngine engine = manager.getEngineByName("javascript"); reader = new FileReader(JS_FILE_PATH); // 执行指定脚本 engine.eval(reader); if(engine instanceof Invocable) { Invocable invoke = (Invocable)engine; return (String) invoke.invokeFunction(ENCRYPT_METHOD, pwd); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if(reader != null){ try { reader.close(); } catch (IOException e) { e.printStackTrace(); }finally { reader = null; } } } return StringUtils.EMPTY; }