国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

JDK6的新特性:腳本語言支持(Scripting)

2019-11-17 06:04:24
字體:
供稿:網(wǎng)友

概述

-----------------------------

    JDK6增加了對腳本語言的支持(JSR 223),原理上是將腳本語言編譯成bytecode,這樣腳本語言也能享用java平臺的諸多優(yōu)勢,包括可移植性,安全等,另外,由于現(xiàn)在是編譯成bytecode后再執(zhí)行,所以比原來邊解釋邊執(zhí)行效率要高很多。加入對腳本語言的支持后,對Java語言也提供了以下好處。

1、許多腳本語言都有動態(tài)特性,比如,你不需要用一個變量之前先聲明它,你可以用一個變量存放完全不同類型的對象,你不需要做強制類型轉(zhuǎn)換,因為轉(zhuǎn)換都是自動的?,F(xiàn)在Java語言也可以通過對腳本語言的支持間接獲得這種靈活性。

2、 可以用腳本語言快速開發(fā)產(chǎn)品原型,因為現(xiàn)在可以Edit-Run,而無需Edit-Compile-Run,當然,因為Java有非常好的IDE支持,我 們完全可以在IDE里面編輯源文件,然后點擊運行(隱含編譯),以此達到快速開發(fā)原型的目的,所以這點好處基本上可以忽略。

3、通過引入腳本語言可以輕松實現(xiàn)Java應(yīng)用程序的擴展和自定義,我們可以把原來分布在在Java應(yīng)用程序中的配置邏輯,數(shù)學(xué)表達式和業(yè)務(wù)規(guī)則提取出來,轉(zhuǎn)用JavaScript來處理。

   Sun的JDK6實現(xiàn)包含了一個基于Mozilla Rhino的 腳本語言引擎,支持Javascript,這并不是說明JDK6只支持JavaScript,任何第三方都可以自己實現(xiàn)一個JSR-223兼容的腳本引擎 使得JDK6支持別的腳本語言,比如,你想讓JDK6支持Ruby,那你可以自己按照JSR 223的規(guī)范實現(xiàn)一個Ruby的腳本引擎類,具體一點,你需要實現(xiàn)javax.script.ScriptEngine(簡單起見,可以繼續(xù)javax.script.AbstractScriptEngine)和javax.script.ScriptEngineFactory兩個接口。當然,在你實現(xiàn)自己的腳本語言引擎之前,先到scripting.dev.java.net PRoject 這里看看是不是有人已經(jīng)幫你做了工作,這樣你就可以直接拿來用就行。

Scripting API

-------------------------------
    Scripting API是用于在Java里面編寫腳本語言程序的API, 在Javax.script中可以找到Scripting API,我們就是用這個API來編寫JavaScript程序,這個包里面有一個ScriptEngineManager類,它是使用Scripting API的入口,ScriptEngineManager可以通過jar服務(wù)發(fā)現(xiàn)(service discovery)機制尋找合適的腳本引擎類(ScriptEngine),使用Scripting API的最簡單方式只需下面三步
1、創(chuàng)建一個ScriptEngineManager對象
2、通過ScriptEngineManager獲得ScriptEngine對象
3、用ScriptEngine的eval方法執(zhí)行腳本

下面是一個Hello World程序

/** * @author chinajash */
public class HelloScript {
public static void main(Strin [] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManage();//step 1
        ScriptEngine engine = factory.getEngineByName("JavaScript");//Step 2
            engine.eval("print('Hello, Scripting')");//Step 3 
   }
    }

    運行上面程序,控制臺會輸出Hello, Scripting上面這個簡單的Scripting程序演示了如何在Java里面運行腳本語言,除此之外,我們還可以利用Scripting API實現(xiàn)以下功能1、暴露Java對象為腳本語言的全局變量2、在Java中調(diào)用腳本語言的方法3、腳本語言可以實現(xiàn)Java的接口4、腳本語言可以像Java一樣使用JDK平臺下的類下面的類演示了以上4種功能

package Scripting;
import java.io.File;import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/** * @author chinajash */
public class ScriptingAPITester {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager manager = new ScriptEngineManager(); 
       ScriptEngine engine = manager.getEngineByName("JavaScript");
        testScriptVariables(engine);//演示如何暴露Java對象為腳本語言的全局變量
         testInvokeScriptMethod(engine);//演示如何在Java中調(diào)用腳本語言的方法
         testScriptInterface(engine);//演示腳本語言如何實現(xiàn)Java的接口
         testUsingJDKClasses(engine);//演示腳本語言如何使用JDK平臺下的類
    }
        public static void testScriptVariables(ScriptEngine engine) throws ScriptException{
        File file = new File("test.txt"); 
       engine.put("f", file); 
       engine.eval("println('Total Space:'+f.getTotalSpace())"); 
           }
        public static void testInvokeScriptMethod(ScriptEngine engine) throws Exception{
        String script = "function hello(name) { return 'Hello,' + name;}"; 
       engine.eval(script); 
       Invocable inv = (Invocable) engine; 
       String res = (String)inv.invokeFunction("hello", "Scripting" ); 
       System.out.println("res:"+res); 
   }
        public static void testScriptInterface(ScriptEngine engine) throws ScriptException{
        String script = "var obj = new Object(); 
obj.run = function() { println('run method called'); 
}"; 
       engine.eval(script); 
       Object obj = engine.get("obj"); 
       Invocable inv = (Invocable) engine; 
       Runnable r = inv.getInterface(obj,Runnable.class); 
       Thread th = new Thread(r);
        th.start();
    } 
       public static void testUsingJDKClasses(ScriptEngine engine) throws Exception{
        //Packages是腳本語言里的一個全局變量,專用于訪問JDK的package 
       String js = "function doSwing(t){var f=new Packages.javax.swing.JFrame(t);
f.setSize(400,300);f.setVisible(true);}"; 
       engine.eval(js); 
       Invocable inv = (Invocable) engine; 
       inv.invokeFunction("doSwing", "Scripting Swing" ); 
   }
}
Scripting Tool

-----------------------------



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 邛崃市| 海阳市| 屏东县| 溧阳市| 阿克| 黄陵县| 永济市| 望奎县| 德兴市| 德昌县| 沈丘县| 开封市| 高平市| 洪雅县| 嘉鱼县| 安新县| 当涂县| 祁阳县| 铜鼓县| 鄂托克旗| 锦州市| 砚山县| 鄢陵县| 桓仁| 宁津县| 乡城县| 乌拉特中旗| 锦屏县| 镇原县| 抚松县| 繁峙县| 壶关县| 平定县| 大兴区| 石阡县| 石狮市| 蛟河市| 田阳县| 土默特左旗| 防城港市| 汉沽区|