对象脚本语言BeanShell介绍

转自:http://blog.csdn.net/pengchua/article/details/4157682

我们知道,现在有很多脚本语言,大家平时使用的比较多的包括Perl,Python,Ruby,Javascript,Groovy,在这里我要介绍的是另外一个对象脚本语言BeanShell(http://www.beanshell.org)。
    BeanShell的解释器是用Java写的,开源并且免费的,引用open-open上面的话来说明它的运作方式“它将脚本化对象看作简单闭包方法(simple method closure)来支持,就如同在Perl和JavaScript中的一样。 它具有以下的一些特点:使用Java反射API以提供Java语句和表达式的实时解释执行;可以透明地访问任何Java对象和API;可以在命令行模式、控制台模式、小程序模式和远程线程服务器模式等四种模式下面运行;与在应用程序中一样,可以在小程序中(Applet)正常运行(无需编译器或者类装载器);非常精简的解释器jar文件大小为175k ”。
    每一种脚本语言都有它的使用场景,而正是因为其在某些场景的使用而使语言本身得到了发扬光大,比如Ruby正是因为Ruby On Rails这个Web框架的流行而得到开发者的关注,Groovy也一样;BeanShell可不能再有Web框架,Java世界的Web框架已经太多了,够让人头痛的了;BeanShell是Java语法,所以对Java开发者来说,很快就可以上手,BeanShell不能像Ruby,Perl,Ruby一样可以占据一个系统的主体,而只能在一些小的地方发挥“螺丝钉”的作用。

使用BeanShell可以处理现实中不规则的业务,举个很典型的例子,我们知道,一个保险公司有很多险种,每个险种的投入和收益的算法是很复杂的,无法用规则的关系数据库模型来描述,所以很多保险系统在处理险种的算法都是硬编码,如果要在系统中新加一个险种,是非常麻烦的,重新修改代码,重新发布,这对开发/维护人员和客户都是很痛苦的,有了BeanShell,我们可以从这种痛苦中解脱出来,对每个险种使用不同的脚本,新加的险种我们新配一个脚本,这样既可以满足业务多变的要求,又可以减少工作量,节约成本。
   BeanShell的一个特点是动态执行Java代码,脚本文件改变不会影响当前脚本的调用,新脚本将在脚本的下一次调用生效,这不同于配置文件,配置文件改变一般都需要应用重启。
    下面举个例子来说明BeanShell的使用(JDK1.5,BeanShell2.04),
调用文件:
import bsh.Interpreter;
public class TestShell
{
public static void main(String[] args) throws Exception
{
  Interpreter inter = new Interpreter();
  inter.set("inValue",new Integer(1));
  inter.source("/D:/tomgether/test/shell/test.bsh");
   
  System.out.println(((Integer)inter.get("outValue")).intValue());
}
}
Shell文件:
System.out.println("hello,in value is "+inValue);
outValue = inValue+1;
结果:
hello,in value is 1
2

有用的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).请看用户手册中的详细内容。

### 回答1: JMeter的BeanShell脚本语言是一种基于Java语言的脚本语言,它可以在JMeter中用于编写自定义的测试逻辑和数据处理逻辑。BeanShell脚本语言具有Java语言的所有特性,包括面向对象编程、变量、运算符、控制结构等,同时还支持动态编译和执行。在JMeter中,BeanShell脚本语言可以用于编写PreProcessor、PostProcessor、Sampler和Assertion等组件的逻辑代码,以实现更加灵活和定制化的测试方案。 ### 回答2: JMeter是一款功能强大的性能测试工具,其中的BeanShell脚本语言作为JMeter的一种脚本语言,可以帮助开发人员通过脚本快速实现自己所需要的功能。 BeanShell是一种基于Java语法的脚本语言,可以在JMeter中直接使用,无需编译,具有较高的灵活性。它是一种轻量级脚本语言,使用起来简单,语法与Java语言也非常相似。 使用BeanShell脚本语言可以实现JMeter中的高级编程功能,通过编写脚本代码,可以对性能测试过程进行自动化,并且可以自定义一些复杂的测试场景。 通过Beanshell脚本语言,你可以在JMeter中实现更加复杂的逻辑处理,使用它可以轻松地与Java程序相互通信,更加直观地控制测试过程,使得性能测试过程更加灵活多样化。 BeanShell脚本语言有许多的应用场景,例如当测试过程的需求超出了JMeter本身提供的功能,可以利用BeanShell进行自定义功能的实现,自定义数据生成器或者完成一个复杂的算法等,还可以通过各种方法来对请求参数进行更细致的处理等。 总之,BeanShell脚本语言不仅提供了一种简单的解决方案,而且它还可以将许多常见的测试情况转变为可以重用的代码模块。JMeter中使用BeanShell脚本语言确实可以为我们的测试工作带来更高的效率和更多的便利。 ### 回答3: Apache JMeter是一款广泛使用的开源软件,主要用于对Web应用程序进行性能测试。 JMeter可以模拟大量用户同时请求Web服务器,并能够提供对服务器的负载测试。同时,JMeter还具备一些强大的功能,例如多种协议支持,测试结果分析等。而beanshell脚本语言是JMeter的一种特殊功能,它可以使用户自定义执行JMeter任务所需的Java代码的功能。 Beanshell脚本语言是Java语言的一个简化实现。在JMeter中,它提供了与Java API的完全兼容性。因此,它可以在JMeter测试计划中以与Java相同的方式引用对象和执行Java代码。它还包含了许多自己的语法。 Beanshell脚本语言的主要功能包括: 首先,Beanshell脚本语言可以访问JMeter所使用的Java对象。由于JMeter使用Java编写,因此它能够访问Java API和其他外部库,例如JDBC数据库驱动程序和SOAP / REST客户端等。这使得脚本语言成为JMeter的一个特别重要的功能,因为它可以让用户轻松地扩展测试计划并访问其他系统中的数据。 其次,Beanshell脚本语言可以用于自定义高级脚本执行顺序。这允许用户控制脚本的执行方式。脚本语言可以添加到测试计划中,以执行特定的操作或操作序列。脚本语言可以在测试计划中的多个点中触发,这使得脚本语言非常灵活和可配置。 第三,Beanshell脚本语言可以用于在测试运行期间的动态变量和属性设置。该脚本语言可以访问测试中使用的变量和属性,以及计算结果。通过Beanshell脚本语言自定义的动态变量设置,可以使用户自定义测试场景,并且可以在多个测试场景之间共享。 第四,Beanshell脚本语言可以用于处理性能测试数据,并且可以基于这些数据更好地优化Web应用程序。通过Beanshell脚本,可以自动捕获和操作JMeter性能测试的数据,从而优化应用程序并提高性能。 总结起来,Beanshell脚本语言是JMeter的一个非常强大的功能。它可以让用户自由扩展测试计划,自定义执行顺序,动态变量和属性设置,并处理性能测试数据等。因此,它是JMeter有效性能测试的关键一环,让测试变得更加灵活和可扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值