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;
	}

  

 

 

 

 

posted on 2017-02-23 11:17  Luis、Yang、  阅读(3098)  评论(0编辑  收藏  举报

导航