快速入門(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用戶(hù)請(qǐng)將bsh.jar放在JAVA_HOME/jre/lib/ext文件夾,OSX用戶(hù)可以放在/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)用戶(hù)手冊(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)看用戶(hù)手冊(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 閱讀(2472)
評(píng)論(0) 編輯 收藏