JavaScript翻译成Java
这两天公司有一个需求,将一段加密的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;
}
JavaScript翻译成Java的更多相关文章
- 把Scheme翻译成Java和C++的工具
一.为什么要写这个工具? 公司内容有多个项目需要同一个功能,而这些项目中,有的是用Java的,有的是用C++的,同时由于某些现实条件限制,无法所有项目都调用统一的服务接口(如:可能运行在无网络的情况下 ...
- 【探索】机器指令翻译成 JavaScript
前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...
- 机器指令翻译成 JavaScript —— No.5 指令变化
上一篇,我们通过内置解释器的方案,解决任意跳转的问题.同时,也提到另一个问题:如果指令发生变化,又该如何应对. 指令自改 如果指令加载到 RAM 中,那就和普通数据一样,也是可以随意修改的.然而,对应 ...
- 机器指令翻译成 JavaScript —— No.6 深度优化
第一篇 中我们曾提到,JavaScript 最终还得经过浏览器来解析.因此可以把一些优化工作,交给脚本引擎来完成. 现代浏览器的优化能力确实很强,但是,运行时的优化终归是有限的.如果能在事先实现,则可 ...
- 机器指令翻译成 JavaScript —— No.7 过渡语言
上一篇,我们决定使用 LLVM 来优化程序,并打算用 C 作为输入语言.现在我们来研究一下,将 6502 指令转换成 C 的可行性. 跳转支持 翻译成 C 语言,可比 JS 容易多了.因为 C 支持 ...
- 机器指令翻译成 JavaScript —— 终极目标
上一篇,我们顺利将 6502 指令翻译成 C 代码,并演示了一个案例. 现在,我们来完成最后的目标 -- 转换成 JavaScript. 中间码输出 我们之所以选择 C,就是为了使用 LLVM.现在来 ...
- 【Java】 剑指offer(46) 把数字翻译成字符串
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成" ...
- java中为什么把Checked Exception翻译成受检的异常?
6.Checked Exception(受检的异常) 马克-to-win:为什么我大胆的把Checked Exception翻译成受检的异常?因为这类异常,编译器检查发现到它后会强令你catch它或t ...
- 机器指令翻译成 JavaScript —— No.2 跳转处理
上一篇,我们发现大多数 6502 指令都可以直接 1:1 翻译成 JS 代码,但除了「跳转指令」. 跳转指令,分无条件跳转.条件跳转.从另一个角度,也可分: 静态跳转:目标地址已知 动态跳转:目标地址 ...
随机推荐
- 用VUE做网站后台
介绍: 这是一个用vuejs2.0和element搭建的后台管理界面. 相关技术: vuejs2.0:渐进式JavaScript框架,易用.灵活.高效,似乎任何规模的应用都适用. element:基于 ...
- Spring学习总结(13)——Spring+Log4j+ActiveMQ实现远程记录日志
应用场景 随着项目的逐渐扩大,日志的增加也变得更快.Log4j是常用的日志记录工具,在有些时候,我们可能需要将Log4j的日志发送到专门用于记录日志的远程服务器,特别是对于稍微大一点的应用.这么做的优 ...
- 欢迎各位技术牛人增加Swift QQ群:343549891
急招:五年以上Swift开发经验,24个月工资.30天年假.配司机专车. 欢迎各位技术牛人增加Swift 敏捷大拇指 官方QQ群1: 报上"来自CSDN"就可以.谢谢! 訪问 大拇 ...
- zzulioj--1801--xue姐的小动物(水题)
1801: xue姐的小动物 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 594 Solved: 168 SubmitStatusWeb Boar ...
- 23. Angular 中用 a 标签 href 路由时在浏览器中显示异常 "%2F" 路由失败问题1
这个是angular1.6默认给hash路由上添加了!(感叹号),导致出错,修改方法如下(添加配置,去掉默认前缀感叹号): angular.module('routingDemoApp',['ng ...
- iOS菜鸟成长笔记(1)——第一个iOS应用
前言:阳光小强最近抽时间学习iOS开发,在学习过程中发现了很多有趣的东西也遇到了很多问题,为了在学习过程中能和大家交流,记录下学习的心得和学习成果,所以就有了这一个系列文章,希望这一系列文章能形成一个 ...
- Python(二) 表示‘组’的概念与定义
现实世界中总存在一组一组的事物, 一.列表的定义 type(['hello','world',1,9,True,False]) = <class 'list'> type([[1,2,3, ...
- xfce4 + docky ,docky 上面那透明的一条黑色横线去掉方法
在安装完Debian 9 + xfce4桌面后 ,添加docky启动后,会在docky 上面有一条黑色横线看起来非常不舒服. 去掉方法:设置管理器->窗口管理器微调->合成器->取消 ...
- 如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化展示
大前天我们通过Python网络爬虫对朋友圈的数据进行了抓取,感兴趣的朋友可以点击进行查看,如何利用Python网络爬虫抓取微信朋友圈的动态(上)和如何利用Python网络爬虫爬取微信朋友圈动态——附代 ...
- R学习:《机器学习与数据科学基于R的统计学习方法》中文PDF+代码
当前,机器学习和数据科学都是很重要和热门的相关学科,需要深入地研究学习才能精通. <机器学习与数据科学基于R的统计学习方法>试图指导读者掌握如何完成涉及机器学习的数据科学项目.为数据科学家 ...