隨筆-31  評(píng)論-2  文章-0  trackbacks-0

          快速入門(mén)

          歡迎使用BeanShell.這是一個(gè)速成課程。我們將省去一些重要的選項(xiàng)和細(xì)節(jié)。要學(xué)習(xí)更多的內(nèi)容請(qǐng)看本User's Guide的其它部分。

          下載和運(yùn)行BeanShell

          請(qǐng)到http://www.beanshell.org下載最新的JAR文件。你可以用圖形桌面模式和命令行模式起動(dòng)BeanShell。
          如果你只是要玩一玩BeanShell,你可以在BeanShell的jar文件上雙擊來(lái)起動(dòng)BeanShell的桌面。但不管怎樣,如果你要讓BeanShell與你的類(lèi)與應(yīng)用程序一起工作就必須將BeanShell的jar文件加到classpath中。
          你可以將BeanShell的jar文件拖到JAVA_HOME的ext目錄也可以直接加到classpath中。

          • windows用戶請(qǐng)將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

          然后你就可以運(yùn)行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

          可以在你的應(yīng)用程序內(nèi)部來(lái)運(yùn)行,也可以作為debug及servlet的遠(yuǎn)程服務(wù)器模式,或一個(gè)Applet內(nèi)部來(lái)運(yùn)行BeanShell。請(qǐng)參考"BeanShell Modes of Operation"獲得更多詳情。

          BeanShell GUI

          用GUI模式啟動(dòng)BeanShell后,將打開(kāi)一個(gè)桌面視窗。用鼠標(biāo)右擊在桌面的背景上,你可以打開(kāi)另一個(gè)控制臺(tái)視窗及其它的工具如一個(gè)簡(jiǎn)單的類(lèi)游覽器。
          每一個(gè)控制臺(tái)視窗運(yùn)行一個(gè)獨(dú)立的BeanShell解釋器。這個(gè)圖形化的控制臺(tái)支持基本的歷史命令,行編輯,剪切和粘貼,甚至類(lèi)和變量名的自動(dòng)完成功能。從控制臺(tái)你能開(kāi)啟一個(gè)簡(jiǎn)單的編輯視窗。在它里面,你可以編寫(xiě)腳本和使用‘eval’選項(xiàng)求表達(dá)式的值。

          Java語(yǔ)句和表達(dá)式

          BeanShell能理解標(biāo)準(zhǔn)的JAVA語(yǔ)句,表達(dá)式,和方法宣告。語(yǔ)句和表達(dá)式的內(nèi)容可以是:變量,宣告,賦值,方法調(diào)用,循環(huán),條件等。
          在 Java程序中你必須嚴(yán)格的使用它們,但在BeanShell中,你可以用“寬松類(lèi)型”(loosely typed)的方式來(lái)使用它們。也就是說(shuō),你可以在寫(xiě)腳本時(shí)偷懶,不進(jìn)行變量類(lèi)型的宣告(在原始數(shù)據(jù)類(lèi)型和對(duì)象都可以)。如果你試著用錯(cuò)變量類(lèi) 型,BeanShell將會(huì)給出一個(gè)錯(cuò)誤。
          這里有一些例子:

          • 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命令

          在 剛才那個(gè)例子中我們用了一個(gè)內(nèi)建在BeanShell中的一個(gè)方便的命令print(),來(lái)顯示變量的值。print()跟ava的 System.out.println()非常的相像,除非它能保證輸出總是命令行。print()也可以顯示一些對(duì)象的類(lèi)型(如數(shù)組),但比Java的 更詳細(xì)。另一個(gè)相關(guān)的命令是show(),用來(lái)開(kāi)啟與關(guān)閉顯示你輸入的每一行的結(jié)果。
          這兒是一些其它的BeanShell的命令:
          source(), run() - 將一個(gè)bsh腳本讀到解釋器或運(yùn)行在另一個(gè)解釋器。
          frame() - 顯示一個(gè)Frame或JFrame的GUI組件.
          load(), save() - 載入和保存一個(gè)序列化的對(duì)象到一個(gè)文件.
          cd(), cat(), dir(), pwd(), etc. - 類(lèi)unix的shell命令。
          exec() - 運(yùn)行一個(gè)本地的程序。
          javap() - 打印一個(gè)對(duì)象的方法和字段,類(lèi)似于Java的javap命令。
          setAccessibility() - 開(kāi)啟無(wú)限制的存取private 和protected的組件。
          要獲得更多的信息請(qǐng)查看BeanShell命令的詳細(xì)清單。

          提示:
          BeanShell命令并不是真的"內(nèi)建"其中的,而是作為腳本方法自動(dòng)從classpath載入的. 你可以擴(kuò)展基本命令集并加到classpath中作為自訂義的腳本來(lái)使用。

          腳本方法

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

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

          bsh的方法可以有動(dòng)態(tài)的(寬松的)參數(shù)和返回類(lèi)型。

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

          實(shí)現(xiàn)Interface

          注意:如果要BeanShell能實(shí)現(xiàn)任意的Interface,必須有jdk1.3及以上支持。
          你可以在腳本中用標(biāo)準(zhǔn)的Java內(nèi)部類(lèi)的語(yǔ)法來(lái)實(shí)現(xiàn)Interface.例如:

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

          你 可以不用實(shí)現(xiàn)Interface的所有方法,而只用實(shí)現(xiàn)你需要的方法。如果代碼中調(diào)用了未被實(shí)現(xiàn)的方法,將丟出異常。如果你想重載大量的方法的行為--例 如為日志生成一個(gè)"啞"適配器--你可以在腳本對(duì)象中實(shí)現(xiàn)一個(gè)特殊的方法:invoke(name,args)。invoke()方法用來(lái)處理任何未被定 義的方法的調(diào)用:

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

          腳本對(duì)象

          在 BeanShell中,和在JavaScript與Perl中一樣,腳本對(duì)象是用封閉的方法體一構(gòu)成的。通過(guò)在方法未尾返回一個(gè)特殊值"this",你就 可以像使用方法一樣調(diào)用這個(gè)對(duì)象了。在這個(gè)方法調(diào)用時(shí),你可以給與它任何的值。通常對(duì)象內(nèi)部需要包括方法,所以BeanShell的腳本方法在一定程度上 可再包含一些方法以構(gòu)成腳本對(duì)象。例如:

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

          如果這些代碼對(duì)你來(lái)說(shuō)很陌生,別急,請(qǐng)用戶手冊(cè)可得到更透徹的解釋。

          在 你的腳本中,BeanShell腳本對(duì)象(也就是先前例子中的"this"參照)能自動(dòng)實(shí)現(xiàn)任何JAVA介面類(lèi)型。當(dāng)JAVA代碼調(diào)用相應(yīng)與之通訊的腳本 方法內(nèi)的方法。當(dāng)你試著將腳本對(duì)象作為參數(shù)傳給Java方法時(shí),BeanShell會(huì)自動(dòng)將它造型(cast)為相應(yīng)的類(lèi)型。如要傳遞BeanShell 外部的對(duì)象時(shí),你可以在需要時(shí)顯式的進(jìn)行造型(cast).請(qǐng)看用戶手冊(cè)中的詳細(xì)內(nèi)容。

          從你的應(yīng)用程序調(diào)用BeanShell

          通過(guò)建立一個(gè)BeanShell解釋器,使用eval()或source()命令,你可以在你的應(yīng)用程序中求文本表達(dá)式的值和運(yùn)行腳本。如果你希望在你的腳本內(nèi)部使用一個(gè)對(duì)象,可以用set()方法傳遞對(duì)象的變量參照給BeanShell,并通過(guò)get()方法取得結(jié)果。

          • 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");

           

          BeanShell將成為Java平臺(tái)上的第三種編程語(yǔ)言
          2005-06-08  點(diǎn)擊:8  來(lái)源:CSDN  作者:CSDN
          JCP接納了一個(gè)新的技術(shù)規(guī)范進(jìn)入標(biāo)準(zhǔn)化進(jìn)程,這個(gè)編號(hào)為JSR-274的技術(shù)規(guī)范將把BeanShell引入為Java平臺(tái)上支持的又一種編程語(yǔ)言。

          JSR- 274(http://jcp.org/en/jsr/detail?id=274)是由 Patrick Niemeyer提交的技術(shù)規(guī)范,其目標(biāo)是將BeanShell腳本語(yǔ)言(http://www.beanshell.org/)規(guī)范化為Java虛擬機(jī) 平臺(tái)上支持的第三種編程語(yǔ)言。除了Java之外,Java虛擬機(jī)還支持Groovy腳本語(yǔ)言。Doug Lea、Apache和Google三個(gè)JCP執(zhí)委會(huì)成員對(duì)此規(guī)范表示了支持。

          按照J(rèn)ava最初的設(shè)計(jì)思路,有很多語(yǔ)言都可以在JVM上 運(yùn)行(詳細(xì)列表參見(jiàn)http://en.wikipedia.org/wiki/List_of_Java_scripting_languages), 但這些語(yǔ)言大多沒(méi)有流行起來(lái)。直到2004年為止,Java平臺(tái)事實(shí)上只有一種編程語(yǔ)言,也就是Java。2004年3月,Groovy(JSR- 241)成為了Java平臺(tái)上的第二種編程語(yǔ)言。

          消息全文請(qǐng)看:http://rmh.blogs.com/weblog/2005/05/beanshell_the_3.html

          http://www.cn-java.com/target/news.php?news_id=2450

          簡(jiǎn)介:
          BeanShell是一種腳本語(yǔ)言,一種完全符合java語(yǔ)法的java腳本語(yǔ)言,并且又擁有自己的一些語(yǔ)法和方法,beanShell是一種松散類(lèi)型的腳本語(yǔ)言(這點(diǎn)和JS類(lèi)似)。
          下載地址:http://www.beanshell.org

          設(shè)置環(huán)境
          l 把;bsh-xx.jar放到$JAVA_HOME/jre/lib/ext文件夾下
          l unix: export CLASSPATH=$CLASSPATH:bsh-xx.jar
          l windows: set classpath %classpath%;bsh-xx.jar

          運(yùn)行方式:
          l 界面UI方式 :java bsh.Console
          l 命令行方式 :java bsh.Interpreter
          l 運(yùn)行腳本文件:java bsh.Interpreter filename [ args ]



          簡(jiǎn)單舉例:
          在classpath中設(shè)置好環(huán)境變量,打開(kāi)dos窗口,鍵入:java bsh.Console命令
          出現(xiàn)BeanShell圖片代表設(shè)置成功,beanshell開(kāi)始運(yùn)行





          測(cè)試內(nèi)容:
          設(shè)置變量
          foo = "Foo";
          four = (2 + 2)*2/2;
          打印變量
          print( foo + " = " + four );
          循環(huán)
          for (i=0; i<5; i++)
          print(i);
          在窗口中打印按鈕
          button = new JButton( "My Button" );
          frame = new JFrame( "My Frame" );
          frame.getContentPane().add( button, "Center" );
          frame.pack();
          frame.setVisible(true);

          完整代碼:
          foo = "Foo";
          four = (2 + 2)*2/2;
          print( foo + " = " + four );

          for (i=0; i<5; i++)
          print(i);

          button = new JButton( "My Button" );
          frame = new JFrame( "My Frame" );
          frame.getContentPane().add( button, "Center" );
          frame.pack();
          frame.setVisible(true);


          在窗口中輸入上面的代碼

          敲回車(chē)執(zhí)行,運(yùn)行結(jié)果如圖


          說(shuō)明:
          因?yàn)閎eanshell是松散類(lèi)型的腳本語(yǔ)言因此可以直接寫(xiě)
          foo = "Foo";
          four = (2 + 2)*2/2;

          print是beanshell提供一種簡(jiǎn)單的打印命令相當(dāng)于java中的System.out.println()





          其他的beanshell腳本命令
          · source(), run() – 讀取,或者運(yùn)行一個(gè)腳本文件
          · frame() – 顯示一個(gè)窗口
          · load(), save() – 讀取或者保存一個(gè)腳本對(duì)象到文件
          · cd(), cat(), dir(), pwd(), etc. 使用Unix下面的命令
          · exec() – 運(yùn)行一個(gè)本地的方法
          · javap() –使用javap命令.
          · setAccessibility() – 設(shè)置可以接收private和protected類(lèi)型的變量
          BeanShell命令不一定都是內(nèi)置的腳本命令,腳本方法會(huì)自動(dòng)從classpath中取方法使用,因此你可以添加你自己的腳本到classpath中來(lái)擴(kuò)充基本的命令






          腳本方法
          一般的方法:
          int addTwoNumbers( int a, int b ) {
          return a + b;
          }

          sum = addTwoNumbers( 5, 7 ); // 12
          也可以使用動(dòng)態(tài)的變量類(lèi)型(無(wú)狀態(tài))方法
          add( a, b ) {
          return a + b;
          }
          foo = add(1, 2); // 3
          foo = add(1, “2”); //”12” 只要有一個(gè)為字符串全部按照字符串處理,系統(tǒng)不會(huì)根據(jù)1是數(shù)字在前把“2”轉(zhuǎn)換成數(shù)字處理(特別注意)
          foo = add("Oh", " baby"); // "Oh baby"




          實(shí)現(xiàn)接口
          實(shí)現(xiàn)任何接口需要java1.3或者更高
          可以使用缺省的java匿名類(lèi)的語(yǔ)法實(shí)現(xiàn)一個(gè)接口類(lèi),例如:
          ActionListener scriptedListener = new ActionListener() {
          actionPerformed( event ) { ... }
          }
          不需要實(shí)現(xiàn)接口的所有的方法,只需要實(shí)現(xiàn)你使用的方法即可,如果使用你沒(méi)有實(shí)現(xiàn)的方法,beanshell將拋出一個(gè)錯(cuò)誤,
          ml = new MouseListener() {
          mousePressed( event ) { ... }
          // handle the rest
          invoke( name, args ) { print("Method: "+name+" invoked!");
          }








          腳本對(duì)象
          使用特殊的關(guān)鍵字this可以創(chuàng)建一個(gè)對(duì)象(根JS類(lèi)似)
          foo() {
          print("foo");
          x=5;

          bar() {
          print("bar");
          }

          return this;
          }

          myfoo = foo(); // prints "foo"
          print( myfoo.x ); // prints "5"
          myfoo.bar(); // prints "bar"

          從應(yīng)用程序中調(diào)用BeanShell
          創(chuàng)建一個(gè)BeanShell的解釋器(interpreter)用eval()和source()命令可以對(duì)一個(gè)字符串求值和運(yùn)行一個(gè)腳本文件
          使用set()方法可以給一個(gè)對(duì)象傳入一個(gè)變量的參考
          使用get()方法可以重新得到一個(gè)變量的結(jié)果


          完整代碼:
          package cn.com.sparknet.util;

          import bsh.*;
          import java.util.*;

          public class BeanShell {
          public static void main(String[] args) {
          try {
          Interpreter interpreter = new Interpreter(); // 構(gòu)造一個(gè)解釋器
          interpreter.set("foo", 5); // 設(shè)置變量
          interpreter.set("date", new Date()); //設(shè)置一個(gè)時(shí)間對(duì)象
          Date date = (Date) interpreter.get("date"); // 重新得到時(shí)間變量
          interpreter.println(date.toString()); //打印時(shí)間變量
          interpreter.eval("bar = foo*10"); // 對(duì)一段腳本求值,并得到結(jié)果
          System.out.println(interpreter.get("bar")); //打印變量
          interpreter.source("d:\\helloWorld.bsh"); // 導(dǎo)入并執(zhí)行一個(gè)腳本文件
          }
          catch (Exception e) {
          //如果發(fā)生異常,寫(xiě)入日志文件
          Log.error(new BeanShell(), "main", FormatDate.getCurrDate(), e.getMessage());
          }
          }
          }






          BeanShell語(yǔ)法
          BeanShell是一種最原始的java解釋器。
          標(biāo)準(zhǔn)的java語(yǔ)法
          /*
          Standard Java syntax
          */

          // Use a hashtable
          Hashtable hashtable = new Hashtable();
          Date date = new Date();
          hashtable.put( "today", date );

          // Print the current clock value
          print( System.currentTimeMillis() );

          // Loop
          for (int i=0; i<5; i++)
          print(i);

          // Pop up a frame with a button in it
          JButton button = new JButton( "My Button" );
          JFrame frame = new JFrame( "My Frame" );
          frame.getContentPane().add( button, "Center" );
          frame.pack();
          frame.setVisible(true);
          松散類(lèi)型的java語(yǔ)法
          /*
          Loosely Typed Java syntax
          */

          // Use a hashtable
          hashtable = new Hashtable();
          date = new Date();
          hashtable.put( "today", date );

          // Print the current clock value
          print( System.currentTimeMillis() );

          // 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);
          異常處理
          標(biāo)準(zhǔn)的java異常
          try {
          int i = 1/0;
          } catch ( ArithmeticException e ) {
          print( e );
          }
          松散的異常處理(類(lèi)似JS)
          try {
          ...
          } catch ( e ) {
          ...
          }
          松散類(lèi)型變量的作用范圍
          標(biāo) 準(zhǔn)的java程序的變量作用范圍是在一個(gè)模塊中的(在模塊中聲明的變量),而在松散類(lèi)型的語(yǔ)言中如果在一個(gè)模塊中沒(méi)有指定一個(gè)變量的類(lèi)型,則認(rèn)為是一個(gè)全 局變量(只有它以后的代碼可以使用該變量,系統(tǒng)在調(diào)用該變量的時(shí)候自動(dòng)生成一個(gè)全局變量,也就為什么在調(diào)用模塊之前不能使用該變量的原因)
          // Arbitrary code block
          {
          y = 2; // Untyped variable assigned
          int x = 1; // Typed variable assigned
          }
          print( y ); // 2
          print( x ); // Error! x is undefined.

          // Same with any block statement: if, while, try/catch, etc.
          if ( true ) {
          y = 2; // Untyped variable assigned
          int x = 1; // Typed variable assigned
          }
          print( y ); // 2
          print( x ); // Error! x is undefined.

          同樣也使用于for-loop, if-else等循環(huán)語(yǔ)句
          for( int i=0; i<10; i++ ) { // typed for-init variable
          j=42;
          }
          print( i ); // Error! 'i' is undefined.
          print( j ); // 42

          for( z=0; z<10; z++ ) { } // untyped for-init variable
          print( z ); // 10









          方便靈活的語(yǔ)法
          標(biāo)準(zhǔn)的java語(yǔ)法
          java.awt.Button button = new java.awt.Button();
          button.setLabel(“javaButton”);
          松散的語(yǔ)法
          button = new java.awt.Button();
          button.label = "my button";
          你也可以使用{}來(lái)對(duì)一個(gè)對(duì)象設(shè)置屬性
          b = new java.awt.Button();
          b{"label"} = "my button"; // Equivalent to: b.setLabel("my button");

          h = new Hashtable();
          h{"foo"} = "bar"; // Equivalent to: h.put("foo", "bar");




          包裝和未包裝(box和unbox)
          BeanShell自動(dòng)轉(zhuǎn)為簡(jiǎn)單類(lèi)型
          i=5;
          iw=new Integer(5);
          print( i * iw ); // 25
          導(dǎo)入類(lèi)和包
          import javax.xml.parsers.*;
          import mypackage.MyClass;
          超級(jí)導(dǎo)入法:
          import *;
          BeanShell默認(rèn)導(dǎo)入下面的包
          · java.lang
          · java.io
          · java.util
          · java.net
          · java.awt
          · java.awt.event
          · javax.swing
          · javax.swing.event
          友好文檔實(shí)體
          BeanShell支持特殊的文檔操作類(lèi)型內(nèi)容
          @gt > @lt <
          @lteq <= @gteq >=
          @or || @and &&
          @bitwise_and & @bitwise_or |
          @left_shift << @right_shift >>
          @right_unsigned_shift >>> @and_assign &=
          @or_assign |= @left_shift_assign <<=
          @right_shift_assign >>= @right_unsigned_shift_assign >>>=
          腳本方法
          你可以定義方法象java中的定義方法一樣
          int addTwoNumbers( int a, int b ) {
          return a + b;
          }
          你可以使用內(nèi)餡的BeanShell方法使用他們
          sum = addTwoNumbers( 5, 7 );
          只有BeanShell變量可以被動(dòng)態(tài)定義為動(dòng)態(tài)類(lèi)型,方法可以有動(dòng)態(tài)的參數(shù)以及返回類(lèi)型
          add( a, b ) {
          return a + b;
          }
          在這個(gè)方法中,BeanShell將動(dòng)態(tài)的決定類(lèi)型當(dāng)這個(gè)方法被調(diào)用時(shí)并且能夠準(zhǔn)確的計(jì)算出你想要的結(jié)果
          foo = add(1, 2);
          print( foo ); // 3

          foo = add("Oh", " baby");
          print( foo ); // Oh baby
          在第一個(gè)例子中BeanShell將把參數(shù)定義為數(shù)字型,并返回?cái)?shù)字型
          在第二個(gè)例子中BeanShell將把參數(shù)定義為字符型,并返回字符對(duì)象
          變量和方法的可見(jiàn)范圍
          就像您所預(yù)期的那樣,在方法內(nèi)您可以參考到上下文中上面的變量和方法
          a = 42;
          someMethod() { ... }

          foo() {
          print( a );
          someMethod(); // invoke someMethod()
          }

          // invoke foo()
          foo(); // prints 42
          如果一個(gè)變量只有在方法內(nèi)使用請(qǐng)定義成局部變量,即加上類(lèi)型,如果是全局變量請(qǐng)?jiān)诜椒ㄍ舛x
          var = "global";
          foo() {
          print(var);
          String var = "local";
          print(var);
          }
          foo();
          print(var);
          將打印出
          global
          local
          global
          方法內(nèi)的var(第四行)變量屬于局部變量,不會(huì)覆蓋全局變量var(第一行)的因此改變var(第四行)變量不會(huì)影響到全局變量var(第一行)
          范圍參考:super
          使用super關(guān)鍵字可以在局部參考到全局變量
          var = "global";
          foo() {
          String var = "local";
          print(var);
          print(super.var);
          }
          foo();
          將輸出
          local
          global







          腳本對(duì)象
          this對(duì)象
          在java標(biāo)準(zhǔn)語(yǔ)言中可以使用this返回一個(gè)類(lèi)的一個(gè)實(shí)例
          // MyClass.java
          MyClass {
          Object getObject() {
          return this; // return a reference to our object
          }
          }
          在這個(gè)例子中g(shù)etObject() 方法是返回MyClass類(lèi)的一個(gè)實(shí)例
          在BeanShell中對(duì)象中的變量只是局部的變量在對(duì)象內(nèi)可以使用,在對(duì)象外是不可以使用(不同于前面for-loop,if-else中的使用);
          // Define the foo() method:
          foo() {
          bar = 42;
          print( bar );
          }

          // Invoke the foo() method:
          foo(); // prints 42

          print( bar ); // Error, bar is undefined here
          可以使用this返回對(duì)象,使用對(duì)象加上“.”運(yùn)算符參考屬性(類(lèi)似JS)
          foo() {
          bar = 42;
          return this;
          }

          fooObj = foo();
          print( fooObj.bar ); // prints 42!
          同樣對(duì)象中也可以定義一些方法
          foo() {
          bar() {
          ...
          }
          }
          例如
          foo() {
          int a = 42;
          bar() {
          print("The bar is open!");
          }

          bar();
          return this;
          }

          // Construct the foo object
          fooObj = foo(); // prints "the bar is open!"
          // Print a variable of the foo object
          print ( fooObj.a ) // 42
          // Invoke a method on the foo object
          fooObj.bar(); // prints "the bar is open!"
          也可以把bar()和foo也可以代參數(shù)
          foo() {
          return this;
          }
          bar(int a) {
          print("The bar is open!" + a);
          }
          foo().bar(1);
          也可以把bar()方法定義到對(duì)象外面

          foo() {
          bar(int a) {
          print("The bar is open!" + a);
          }
          return this;
          }
          foo().bar(1);
          BeanShell一種松散的腳本語(yǔ)言,有很多中聲明的方法可以使用
          This super global
          This是參考當(dāng)前對(duì)象
          Super是參考父親對(duì)象
          Global是參考最上層對(duì)象
          super.super.super...foo = 42; // Chain super. to reach the top
          global.foo = 42;








          簡(jiǎn)單例子:
          文本拖動(dòng):

          dragText() {
          f = new Frame("Drag in the box");
          f.setFont( new Font("Serif", Font.BOLD, 24) );
          f.setSize(300, 300);
          f.show();
          gc = f.getGraphics();
          gc.setColor(Color.cyan);
          mouseDragged( e ) {
          gc.drawString("Drag Me!", e.getX(), e.getY());
          }
          mouseMoved( e ) { }
          f.addMouseMotionListener( this );
          }
          簡(jiǎn)單畫(huà)圖

          import bsh.util.BshCanvas; // BshCanvas simply buffers graphics

          graph( int width, int height ) {
          canvas=new BshCanvas();
          canvas.setSize( width, height );
          frame=frame( canvas );
          graphics=canvas.getBufferedGraphics();
          // draw axis
          graphics.setColor( Color.red );
          graphics.drawLine( 0, height/2, width, height/2 );
          graphics.drawLine( width/2, 0, width/2, height );
          graphics.setColor( Color.black );

          plot(int x, int y) {
          graphics.fillOval( (x+width/2-1), (y+height/2-1), 3, 3);
          canvas.repaint();
          }

          return this;
          }

          drawSin( graph ) {
          for (int x=-100; x<100; x++ ) {
          y=(int)(50*Math.sin( x/10.0 ));
          graph.plot( x, y );
          }
          }
          簡(jiǎn)單web瀏覽器

          import javax.swing.*;
          import javax.swing.event.*;
          import javax.swing.text.*;
          import java.awt.event.*;
          import java.awt.*;

          JFrame browser( startingUrl ) {
          invoke( method, args ) {}

          windowClosing(WindowEvent we) {
          we.getWindow().setVisible(false);
          }

          setPage( url ) {
          try {
          pane.setPage( url );
          } catch(Exception e) {
          statusBar.setText("Error opening page: "+url);
          }
          }

          hyperlinkUpdate( HyperlinkEvent he ) {
          type = he.getEventType();
          if (type == HyperlinkEvent.EventType.ENTERED) {
          pane.setCursor(
          Cursor.getPredefinedCursor( Cursor.HAND_CURSOR) );
          statusBar.setText(he.getURL().toString());
          } else
          if (type == HyperlinkEvent.EventType.EXITED) {
          pane.setCursor( Cursor.getDefaultCursor() );
          statusBar.setText(" ");
          } else {
          setPage( he.getURL() );
          if (urlField != null)
          urlField.setText(he.getURL().toString());
          }
          }

          frame = new JFrame("Browser");
          frame.setSize(400,300);
          frame.addWindowListener( this );

          urlPanel = new JPanel();
          urlPanel.setLayout(new BorderLayout());
          urlField = new JTextField(startingUrl);
          urlPanel.add(new JLabel("Site: "), BorderLayout.WEST);
          urlPanel.add(urlField, BorderLayout.CENTER);

          statusBar = new JLabel(" ");
          pane = new JEditorPane();
          pane.setEditable(false);
          setPage( startingUrl );
          jsp = new JScrollPane(pane);

          frame.getContentPane().add(jsp, BorderLayout.CENTER);
          frame.getContentPane().add(urlPanel, BorderLayout.SOUTH);
          frame.getContentPane().add(statusBar, BorderLayout.NORTH);

          // This is the equivalent of an inner class in bsh.
          urlTextHandler() {
          actionPerformed(ActionEvent ae) {
          setPage( ae.getActionCommand() );
          }
          return this;
          }

          urlField.addActionListener( urlTextHandler() );
          pane.addHyperlinkListener( (HyperlinkListener)this );

          return frame;
          }
          browser = browser("http://java.sun.com/");
          browser.show();




          更多的文檔參考BeanShell網(wǎng)站

          http://www.beanshell.org
          posted on 2008-10-08 14:34 xiaoxinchen 閱讀(2475) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 惠水县| 哈密市| 依兰县| 大方县| 通辽市| 佛教| 邛崃市| 龙江县| 虹口区| 宜昌市| 会泽县| 陆良县| 高州市| 罗山县| 嘉鱼县| 巫溪县| 连州市| 全椒县| 余姚市| 启东市| 镇沅| 收藏| 冷水江市| 商水县| 黄浦区| 纳雍县| 南京市| 富蕴县| 长垣县| 容城县| 开平市| 宁城县| 秭归县| 华亭县| 饶河县| 衢州市| 陆河县| 方城县| 佛山市| 泰和县| 四子王旗|