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