今天在書上看的,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的函數稍微改變了一下,結果就不同了,這就是腳本語言對編譯最有利的地方,可以隨時發佈而不用重新部署。
你,學會了嗎?有疑問可以留言評論哦~