)BeanShell快速入門—Java應用程式指令碼引擎

來源:互聯網
上載者:User
 關鍵字: BeanShell

今天研究Carrot2原始碼,查看其的整個資料流程,發現他把很多變動的東西用組件的形式來實現,而通過指令碼來跟應用程式建立紐帶。這個指令碼就是BeanShell,發現還挺好用,轉載一片不錯的文章。

 

BeanShell快速入門---Java應用程式指令碼引擎
http://www.daima.com.cn/Info/55/Info32134/

快速入門

歡迎使用BeanShell.這是一個速成課程。我們將省去一些重要的選項和細節。要學習更多的內容請看本User's Guide的其它部分。

下載和運行BeanShell

請到http://www.beanshell.org下載最新的JAR檔案。你可以用圖形桌面圖案和命令列模式起動BeanShell。
如果你只是要玩一玩BeanShell,你可以在BeanShell的jar檔案上雙擊來起動BeanShell的案頭。但不管怎樣,如果你要讓BeanShell與你的類與應用程式一起工作就必須將BeanShell的jar檔案加到classpath中。
你可以將BeanShell的jar檔案拖到JAVA_HOME的ext目錄也可以直接加到classpath中。

  • windows使用者請將bsh.jar放在JAVA_HOME/jre/lib/ext檔案夾,OSX使用者可以放在/Library/Java/Extensions.
    或者增加BeanShell到你的classpath目錄,如:
    unix: export CLASSPATH=$CLASSPATH:bsh-xx.jar
    windows:set classpath %classpath%;bsh-xx.jar

然後你就可以運行BeanShell在GUI或命令列模式:

  •  java bsh.Console       // run the graphical desktop
    or
         java bsh.Interpreter   // run as text-only on the command line
    or
         java bsh.Interpreter filename [ args ] // run script file

可以在你的應用程式內部來運行,也可以作為debug及servlet的遠程伺服器模式,或一個Applet內部來運行BeanShell。請參考"BeanShell Modes of Operation"獲得更多詳情。

BeanShell GUI

用GUI模式啟動BeanShell後,將開啟一個案頭視窗。用滑鼠右擊在案頭的背景上,你可以開啟另一個控制台視窗及其它的工具如一個簡單的類遊覽器。
每一個控制台視窗運行一個獨立的BeanShell解譯器。這個圖形化的控制台支援基本的曆史命令,行編輯,剪下和粘貼,甚至類和變數名的自動完成功能。從控制台你能開啟一個簡單的編輯視窗。在它裡面,你可以編寫指令碼和使用‘eval’選項求運算式的值。

Java語句和運算式

BeanShell能理解標準的JAVA語句,運算式,和方法宣告。語句和運算式的內容可以是:變數,宣告,賦值,方法調用,迴圈,條件等。
在Java程式中你必須嚴格的使用它們,但在BeanShell中,你可以用“寬鬆類型”(loosely typed)的方式來使用它們。也就是說,你可以在寫指令碼時偷懶,不進行變數類型的宣告(在未經處理資料類型和對象都可以)。如果你試著用錯變數類型,BeanShell將會給出一個錯誤。
這裡有一些例子:

  • foo = "Foo";    
    four = (2 + 2)*2/2;
    print( foo + " = " + four );  // print() is a BeanShell command
    // Do a loop
    for (i=0; i<5; i++)
        print(i);   
    // Pop up a frame with a button in it
    button = new JButton( "My Button" );
    frame = new JFrame( "My Frame" );
    frame.getContentPane().add( button, "Center" );
    frame.pack();
    frame.setVisible(true);

有用的BeanShell命令

在剛才那個例子中我們用了一個內建在BeanShell中的一個方便的命令print(),來顯示變數的值。print()跟ava的System.out.println()非常的相像,除非它能保證輸出總是命令列。print()也可以顯示一些對象的類型(如數組),但比Java的更詳細。另一個相關的命令是show(),用來開啟與關閉顯示你輸入的每一行的結果。
這兒是一些其它的BeanShell的命令:
source(), run() - 將一個bsh指令碼讀到解譯器或運行在另一個解譯器。 
frame() - 顯示一個Frame或JFrame的GUI組件. 
load(), save() - 載入和儲存一個序列化的對象到一個檔案. 
cd(), cat(), dir(), pwd(), etc. - 類unix的shell命令。 
exec() - 運行一個本地的程式。
javap() - 列印一個對象的方法和欄位,類似於Java的javap命令。
setAccessibility() - 開啟無限制的存取private 和protected的組件。
要獲得更多的資訊請查看BeanShell命令的詳細清單。

提示:
BeanShell命令並不是真的"內建"其中的,而是作為指令碼方法自動從classpath載入的. 你可以擴充基本命令集並加到classpath中作為自訂義的指令碼來使用。

指令碼方法

你可以在bsh中宣告和使用方法,就像在java的類中一樣。

  • int addTwoNumbers( int a, int b ) {
        return a + b;
    }
    sum = addTwoNumbers( 5, 7 );  // 12

bsh的方法可以有動態(寬鬆的)參數和傳回型別。

  • add( a, b ) {
        return a + b;
    }
    foo = add(1, 2);            // 3
    foo = add("Oh", " baby");   // "Oh baby"

實現Interface

注意:如果要BeanShell能實現任意的Interface,必須有jdk1.3及以上支援。
你可以在指令碼中用標準的Java內部類的文法來實現Interface.例如:

  • ActionListener scriptedListener = new ActionListener() {
        actionPerformed( event ) { ... }
    }

你可以不用實現Interface的所有方法,而只用實現你需要的方法。如果代碼中調用了未被實現的方法,將丟出異常。如果你想重載大量的方法的行為--例如為日誌產生一個"啞"適配器--你可以在指令碼對象中實現一個特殊的方法:invoke(name,args)。invoke()方法用來處理任何未被定義的方法的調用:

  • ml = new MouseListener() {
        mousePressed( event ) { ... }
        // handle the rest
        invoke( name, args ) { print("Method: "+name+" invoked!");
    }

指令碼對象

在BeanShell中,和在JavaScript與Perl中一樣,指令碼對象是用封閉的方法體一構成的。通過在方法未尾返回一個特殊值"this",你就可以像使用方法一樣調用這個對象了。在這個方法調用時,你可以給與它任何的值。通常對象內部需要包括方法,所以BeanShell的指令碼方法在一定程度上可再包含一些方法以構成指令碼對象。例如:

  • foo() {
        print("foo");
        x=5;
        bar() {
            print("bar");
        }
        return this;
    }
    myfoo = foo();    // prints "foo"
    print( myfoo.x ); // prints "5"
    myfoo.bar();      // prints "bar"

如果這些代碼對你來說很陌生,別急,請使用者手冊可得到更透徹的解釋。

在你的指令碼中,BeanShell指令碼對象(也就是先前例子中的"this"參照)能自動實現任何JAVA介面類型。當JAVA代碼調用相應與之通訊的指令碼方法內的方法。當你試著將指令碼對象作為參數傳給Java方法時,BeanShell會自動將它造型(cast)為相應的類型。如要傳遞BeanShell外部的對象時,你可以在需要時顯式的進行造型(cast).請看使用者手冊中的詳細內容。

從你的應用程式調用BeanShell

通過建立一個BeanShell解譯器,使用eval()或source()命令,你可以在你的應用程式中求文本運算式的值和運行指令碼。如果你希望在你的指令碼內部使用一個對象,可以用set()方法傳遞對象的變數參照給BeanShell,並通過get()方法取得結果。

  • import bsh.Interpreter;
    Interpreter i = new Interpreter();  // Construct an interpreter
    i.set("foo", 5);                    // Set variables
    i.set("date", new Date() ); 
    Date date = (Date)i.get("date");    // retrieve a variable
    // Eval a statement and get the result
    i.eval("bar = foo*10");             
    System.out.println( i.get("bar") );
    // Source an external script file
    i.source("somefile.bsh");

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.