zoukankan      html  css  js  c++  java
  • 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;
    	}
    

      

     

     

     

  • 相关阅读:
    【剑指offer】判断二叉树是否为平衡二叉树
    【剑指offer】数字在排序数组中出现的次数
    八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
    约瑟夫环问题-循环链表VS数组
    告别2014,你是否感谢这一年的自己?
    浅谈WEB页面提速(前端向)
    HTML5- Canvas入门(七)
    浅谈WEB安全性(前端向)
    是时候搁置Grunt,耍一耍gulp了
    前端神器avalonJS入门(二)
  • 原文地址:https://www.cnblogs.com/LuisYang/p/6432610.html
Copyright © 2011-2022 走看看