本文内容是BeanShell入门教程的中文化主要包含了以下内容
1.快速入门
2.基本语法
3.脚本方法
4.脚本对象
5.范围值
快速入门
1.下载和运行BeanShell
我们可以在http://www.beanshell.org上下载到BeanShell的最新版本,而且可以在图形化桌面模式或者命令行模式下运行。
如果你只是想下载下来玩玩看,那么双击JAR文件,运行桌面版的就可以了。但是,或许你更想以后长期使用它,那么你应该把这个JAR文件加入到你的classpath中,以便更好的和你的类和应用一起工作。
你当然也可以添加BeanShell到你的Java扩展文件夹下,并且把它添加到你的classpeth中。(注意:如果你把BeanShell放在了扩展文件夹下,而且想和例如Jakarta Ant这样的BSF应用一起使用,你必须安装bsf.jar到相同位置)。
To install as an extension place the bsh.jar file in your
$JAVA_HOME/jre/lib/ext folder. (OSX users: place the bsh.jar in
/Library/Java/Extensions or ~/Library/Java/Extensions for individual users.)
Or add BeanShell to your classpath like this:
unix: export CLASSPATH=$CLASSPATH:bsh-xx.jar
windows: set classpath %classpath%;bsh-xx.jar
标注:你可以使用BeanShell中的addClassPath()和setClassPath()命令来修改classpath。
你当然也可以在GUI或者命令行模式下运行BeanShell。
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
当然BeanShell在你的Java应用中也是可以被调用的。例如:作为远程服务模式用来调试,作为一个servlet或者applet。更加详尽的内容可以参考“BeanShell的操作模式”一节。
2.BeanShell的GUI
BeanShell GUI是用来方便显示BeanShell的功能的。并不是打算替代某个IDE。包含BeanShell脚本功能的一款全功能的开发环境是jEdit编辑器。
如果使用BeanShell的GUI模式,将会打开一个控制台窗口。使用右键可以打开一个附加的控制台窗口和其他的工具例如简单的类浏览器。
每个控制台窗口运行一个独立的BeanShell解释器实例。图形化控制台支持基本的命令历史,行编辑,剪切和粘贴,还有类和变量名补全。在控制台上,你可以打开一个简单的编辑器窗口,在哪里你可以写脚本,并且使用eval选项来对附加控制台的工作空间或者新的工作空间中的文本进行求值运算。
3.Java语句和表达式
BeaShell理解标准的Java语句,表达式和方法声明。语句和表达式是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);
4.有用的BeanShell命令
在前面的例子中我们使用了便捷的内建BeanShell命令print()来显示值。print()做的事情和System.out.println()差不多,它确保输出内容到命令行中。print()显示一些类型的对象时比Java要啰嗦,例如数组类型。另外一个相关的命令是show(),自动显示你打入的每一行。
还有一些其他常用的BeanShell命令如下:
source(),run():读一个bsh脚本到当前解释器(interpreter)中,或者在新的解释器中运行这个脚本
frame():使用Frame或者JFrame显示一个GUI组件(component)
load(),save():从文件中加载一个序列化对象(serializable object),或者把它保存到文件中
cd(),cat(),dir(),pwd(),etc:类似于Unix中的命令
exec():运行一个本地应用(native application)
javap():打印一个对象的方法和域,类似于Java中的javap命令的输出
setAccessibility():使得私有的(private)和受保护的(protected)组件可被自由访问(unrestricted access)
标注:BeanShell命令并不是真正的内建的(built-in),而是从classpath自动加载的简单的BeanShell脚本,你可以向classpath中添加自己的脚本来扩展基本的命令集。
5.脚本方法
你可以声明和使用方法就像在Java的class中一样。
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"
6.接口实现
注意:BeanShell中实现任何接口,都需要Java1.3或者更高版本。
你可以使用标准的Java匿名内部类语法来实现一个接口类型,如下所示:
ActionListener scriptedListener = new ActionListener() {
actionPerformed( event ) { ... }
}
你当然也没有必要脚本化接口的所有方法。你可以选择脚本化那些你可能要调用的方法。若果你尝试调用一个没有被定义的方法,那么代码会抛出异常。如果你希望重载大量方法的行为-例如为logging产生一个伪适配器-你可以实现一个特殊的方法签名:invoke(name, args),这个方法用来处理未定义的方法被调用的情况。
ml = new MouseListener() {
mousePressed( event ) { ... }
// handle the rest
invoke( name, args ) { print("Method: "+name+" invoked!");
}
7.脚本对象
在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脚本对象(例如:像前面例子的myFoo一样的任何‘this’类型的引用)可以自动地实现任意Java接口类型。当Java代码调用接口中的函数时,相应的脚本函数将被调用来处理它们。BeanShell将会自动地转化你的脚本对象,当你试图把它传给一个使用了接口类型的参数的方法时。传递BeanShell之外的脚本引用时,你可以使用强制转换。后面会详细讲解。
8.在你的应用中调用BeanShell
你在你的应用中可以创建BeanShell解释器实例并且使用eval()或者source()命令来获取文本或者执行脚本。你或许想往脚本中传递值,那么可以使用后set(),或者从中获得结果值,那么可以使用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");