什麼?java中居然可以執行js代碼了?真是不知者不怪

今天在書上看的,java中可以直接調用js的函數了,言外之意就是java已經支持外部的腳本語言了(在運行期解釋執行的),查了查,jdk從1.6之後開始支持的,1.6之前不可以。

爲什麼Java這種編譯語言還需要這些腳本語言呢?大概是因爲腳本語言有的一些特性java沒有吧,比如:

靈活,一般像js這種腳本語言,你可以不用聲明變量類型而直接使用,也可以在運行期改變類型。
方便,我們都知道java語言運行之前需要編譯成字節碼文件,然後才能運行。但是腳本語言是一種解釋型語言,它的執行是靠解釋器解釋的,因此在運行期變更代碼也非常方便,不用停止應用。

簡單,只要有其他編程語言開發的經驗,在入門腳本語言很容易上手。

你看,這麼些特點java是沒有的,那如果引到java裏面,是不是能使得java更加強大,答案是肯定的。

下面我們來寫一個簡單的案例:
先創建一個js文件,名爲index.js,放在D:\下面,這個js裏面我們就只寫一個js函數,代碼如下:

function reckon(num1,num2){
	return num1+num2*n;
}

你可能會納悶,這個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 block
				e.printStackTrace();
			}
		}
	}

其運行結果爲:
在這裏插入圖片描述
現在我們來簡單的改一改js函數(注意別讓jvm停),將後面的乘號改成減號,修改之後的代碼爲:

function reckon(num1,num2){
	return num1+num2-n;
}

然後我們在控制檯中繼續輸入數字,其運行結果爲:
在這裏插入圖片描述
通過分析,我們可以看到,jvm並沒有停止,代碼while循環可以證明,只要不輸入非int類型的數字,那麼程序就一直執行。參數我們兩次也都輸入的一樣,num1 = 10和num2 = 20,n=2,只是我們將js的函數稍微改變了一下,結果就不同了,這就是腳本語言對編譯最有利的地方,可以隨時發佈而不用重新部署。

你,學會了嗎?有疑問可以留言評論哦~
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章