什么?java中居然可以执行js代码了?真是不知者不怪
今天在書上看的,java中可以直接調用js的函數了,言外之意就是java已經支持外部的腳本語言了(在運行期解釋執行的),查了查,jdk從1.6之后開始支持的,1.6之前不可以。
為什么Java這種編譯語言還需要這些腳本語言呢?大概是因為腳本語言有的一些特性java沒有吧,比如:
靈活,一般像js這種腳本語言,你可以不用聲明變量類型而直接使用,也可以在運行期改變類型。
方便,我們都知道java語言運行之前需要編譯成字節碼文件,然后才能運行。但是腳本語言是一種解釋型語言,它的執行是靠解釋器解釋的,因此在運行期變更代碼也非常方便,不用停止應用。
簡單,只要有其他編程語言開發的經驗,在入門腳本語言很容易上手。
你看,這么些特點java是沒有的,那如果引到java里面,是不是能使得java更加強大,答案是肯定的。
下面我們來寫一個簡單的案例:
先創建一個js文件,名為index.js,放在D:\下面,這個js里面我們就只寫一個js函數,代碼如下:
你可能會納悶,這個n怎么來的?在這里不報錯嗎?是的,不報錯,這個n是從上下文來的,相當于一個運行時變量,接下來我們看看java中怎么調用該js文件中的函數,下面是代碼:
//java調用腳本語言public static void testJavaScript(){//獲得一個JavaScript引擎ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");//建立上下文變量Bindings bind = engine.createBindings();bind.put("n", 2);//綁定上下文,作用域是當前引擎范圍engine.setBindings(bind, ScriptContext.ENGINE_SCOPE);Scanner sc = new Scanner(System.in);while(sc.hasNextInt()){int num1 = sc.nextInt();int num2 = sc.nextInt();//執行js代碼try {engine.eval(new FileReader("D://index.js"));//是否可調用方法if(engine instanceof Invocable){Invocable in = (Invocable)engine;//執行js函數Double result = (Double)in.invokeFunction("reckon", num1,num2);System.out.println("運算結果為:"+result);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (ScriptException e) {e.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}其運行結果為:
現在我們來簡單的改一改js函數(注意別讓jvm停),將后面的乘號改成減號,修改之后的代碼為:
然后我們在控制臺中繼續輸入數字,其運行結果為:
通過分析,我們可以看到,jvm并沒有停止,代碼while循環可以證明,只要不輸入非int類型的數字,那么程序就一直執行。參數我們兩次也都輸入的一樣,num1 = 10和num2 = 20,n=2,只是我們將js的函數稍微改變了一下,結果就不同了,這就是腳本語言對編譯最有利的地方,可以隨時發布而不用重新部署。
你,學會了嗎?有疑問可以留言評論哦~
總結
以上是生活随笔為你收集整理的什么?java中居然可以执行js代码了?真是不知者不怪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你知道i=i++;的含义吗?原理其实没有
- 下一篇: 玩现代战舰要什么配置?