论坛首页 Java企业应用论坛

BeanShell介绍

浏览 8125 次
锁定老帖子 主题:BeanShell介绍
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-04  

    我们知道,现在有很多脚本语言,大家平时使用的比较多的包括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结缘是通过一个开源工作流引擎-OBE(这个鸟东西现在好像没什么声音了),BeanShell被用作流程跳转的Parser,举个例子,比如一个流程A节点的下一个节点是B或者C,如何决定A->B还是A->C呢,我们可以写一段Java脚本放在流程定义里面,一旦A运行完毕,流程会使用BeanShell来Parse这段Java脚本,根据脚本的返回值决定流程下一步的运行方向,脚本在这里虽然用得不多,但是却是非常的重要,我们知道,简单的表达式是远远满足不了流程跳转的判断的,有了脚本就可以满足任何不规则的业务逻辑。

   继以上说到的,使用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


 
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics