简介:

BeanShell是一种脚本语言,一种完全符合java语法的java脚本语言,并且又拥有自己的一些语法和方法,beanShell是一种松散类型的脚本语言(这点和JS类似)。

下载地址:http://www.beanshell.org

设置环境

l把;bsh-xx.jar放到$JAVA_HOME/jre/lib/ext文件夹下

lunix: export CLASSPATH=$CLASSPATH:bsh-xx.jar

lwindows: set classpath %classpath%;bsh-xx.jar

运行方式:

l界面UI方式 :java bsh.Console

l命令行方式 :java bsh.Interpreter

l运行脚本文件:java bsh.Interpreter filename [ args ]

简单举例:

在classpath中设置好环境变量,打开dos窗口,键入:java bsh.Console命令

出现BeanShell图片代表设置成功,beanshell开始运行

测试内容:

设置变量

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

完整代码:

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

在窗口中输入上面的代码

敲回车执行,运行结果如图

说明:

因为beanshell是松散类型的脚本语言因此可以直接写

foo = "Foo";

four = (2 + 2)*2/2;

print是beanshell提供一种简单的打印命令相当于java中的System.out.println()

其他的beanshell脚本命令

·source(), run() – 读取,或者运行一个脚本文件

·frame() – 显示一个窗口

·load(), save() – 读取或者保存一个脚本对象到文件

·cd(), cat(), dir(), pwd(), etc. 使用Unix下面的命令

·exec() – 运行一个本地的方法

·javap() –使用javap命令.

·setAccessibility() – 设置可以接收private和protected类型的变量

BeanShell命令不一定都是内置的脚本命令,脚本方法会自动从classpath中取方法使用,因此你可以添加你自己的脚本到classpath中来扩充基本的命令

脚本方法

一般的方法:

int addTwoNumbers( int a, int b ) {

return a + b;

}

sum = addTwoNumbers( 5, 7 ); // 12

也可以使用动态的变量类型(无状态)方法

add( a, b ) {

return a + b;

}

foo = add(1, 2); // 3

foo = add(1, “2”); //”12” 只要有一个为字符串全部按照字符串处理,系统不会根据1是数字在前把“2”转换成数字处理(特别注意)

foo = add("Oh", " baby"); // "Oh baby"

实现接口

实现任何接口需要java1.3或者更高

可以使用缺省的java匿名类的语法实现一个接口类,例如:

ActionListener scriptedListener = new ActionListener() {

actionPerformed( event ) { ... }

}

不需要实现接口的所有的方法,只需要实现你使用的方法即可,如果使用你没有实现的方法,beanshell将抛出一个错误,

ml = new MouseListener() {

mousePressed( event ) { ... }

// handle the rest

invoke( name, args ) { print("Method: "+name+" invoked!");

}

脚本对象

使用特殊的关键字this可以创建一个对象(根JS类似)

foo() {

print("foo");

x=5;

bar() {

print("bar");

}

return this;

}

myfoo = foo(); // prints "foo"

print( myfoo.x ); // prints "5"

myfoo.bar(); // prints "bar"

从应用程序中调用BeanShell

创建一个BeanShell的解释器(interpreter)用eval()和source()命令可以对一个字符串求值和运行一个脚本文件

使用set()方法可以给一个对象传入一个变量的参考

使用get()方法可以重新得到一个变量的结果

完整代码:

package cn.com.sparknet.util;

import bsh.*;

import java.util.*;

public class BeanShell {

public static void main(String[] args) {

try {

Interpreter interpreter = new Interpreter(); // 构造一个解释器

interpreter.set("foo", 5); // 设置变量

interpreter.set("date", new Date()); //设置一个时间对象

Date date = (Date) interpreter.get("date"); // 重新得到时间变量

interpreter.println(date.toString()); //打印时间变量

interpreter.eval("bar = foo*10"); // 对一段脚本求值,并得到结果

System.out.println(interpreter.get("bar")); //打印变量

interpreter.source("d:\\helloWorld.bsh"); // 导入并执行一个脚本文件

}

catch (Exception e) {

//如果发生异常,写入日志文件

Log.error(new BeanShell(), "main", FormatDate.getCurrDate(), e.getMessage());

}

}

}

BeanShell语法

BeanShell是一种最原始的java解释器。

标准的java语法

/*

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

松散类型的java语法

/*

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

异常处理

标准的java异常

try {

int i = 1/0;

} catch ( ArithmeticException e ) {

print( e );

}

松散的异常处理(类似JS)

try {

...

} catch ( e ) {

...

}

松散类型变量的作用范围

标准的java程序的变量作用范围是在一个模块中的(在模块中声明的变量),而在松散类型的语言中如果在一个模块中没有指定一个变量的类型,则认为是一个

全局变量(只有它以后的代码可以使用该变量,系统在调用该变量的时候自动生成一个全局变量,也就为什么在调用模块之前不能使用该变量的原因)

// 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等循环语句

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

方便灵活的语法

标准的java语法

java.awt.Button button = new java.awt.Button();

button.setLabel(“javaButton”);

松散的语法

button = new java.awt.Button();

button.label = "my button";

你也可以使用{}来对一个对象设置属性

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自动转为简单类型

i=5;

iw=new Integer(5);

print( i * iw ); // 25

导入类和包

import javax.xml.parsers.*;

import mypackage.MyClass;

超级导入法:

import *;

BeanShell默认导入下面的包

·java.lang

·java.io

·java.util

·java.net

·java.awt

·java.awt.event

·javax.swing

·javax.swing.event

友好文档实体

BeanShell支持特殊的文档操作类型内容

@gt>@lt<

@lteq<=@gteq>=

@or||@and&&

@bitwise_and&@bitwise_or|

@left_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;

}

你可以使用内馅的BeanShell方法使用他们

sum = addTwoNumbers( 5, 7 );

只有BeanShell变量可以被动态定义为动态类型,方法可以有动态的参数以及返回类型

add( a, b ) {

return a + b;

}

在这个方法中,BeanShell将动态的决定类型当这个方法被调用时并且能够准确的计算出你想要的结果

foo = add(1, 2);

print( foo ); // 3

foo = add("Oh", " baby");

print( foo ); // Oh baby

在第一个例子中BeanShell将把参数定义为数字型,并返回数字型

在第二个例子中BeanShell将把参数定义为字符型,并返回字符对象

变量和方法的可见范围

就像您所预期的那样,在方法内您可以参考到上下文中上面的变量和方法

a = 42;

someMethod() { ... }

foo() {

print( a );

someMethod(); // invoke someMethod()

}

// invoke foo()

foo(); // prints 42

如果一个变量只有在方法内使用请定义成局部变量,即加上类型,如果是全局变量请在方法外定义

var = "global";

foo() {

print(var);

String var = "local";

print(var);

}

foo();

print(var);

将打印出

global

local

global

方法内的var(第四行)变量属于局部变量,不会覆盖全局变量var(第一行)的因此改变var(第四行)变量不会影响到全局变量var(第一行)

范围参考:super

使用super关键字可以在局部参考到全局变量

var = "global";

foo() {

String var = "local";

print(var);

print(super.var);

}

foo();

将输出

local

global

脚本对象

this对象

在java标准语言中可以使用this返回一个类的一个实例

// MyClass.java

MyClass {

Object getObject() {

return this; // return a reference to our object

}

}

在这个例子中getObject() 方法是返回MyClass类的一个实例

在BeanShell中对象中的变量只是局部的变量在对象内可以使用,在对象外是不可以使用(不同于前面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返回对象,使用对象加上“.”运算符参考属性(类似JS)

foo() {

bar = 42;

return this;

}

fooObj = foo();

print( fooObj.bar ); // prints 42!

同样对象中也可以定义一些方法

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也可以代参数

foo() {

return this;

}

bar(int a) {

print("The bar is open!" + a);

}

foo().bar(1);

也可以把bar()方法定义到对象外面

foo() {

bar(int a) {

print("The bar is open!" + a);

}

return this;

}

foo().bar(1);

BeanShell一种松散的脚本语言,有很多中声明的方法可以使用

This super global

This是参考当前对象

Super是参考父亲对象

Global是参考最上层对象

super.super.super...foo = 42; // Chain super. to reach the top

global.foo = 42;

简单例子:

文本拖动:

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

}

简单画图

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

}

}

简单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();

posted on

2006-10-23 11:31

Bona shen

阅读(15047)

评论(0)

编辑

收藏

java bsh介绍_BeanShell简介相关推荐

  1. java struts 介绍_Struts简介、原理及简单实现

    struts简介 Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过采用JavaServlet/ ...

  2. java程序设计专业介绍_简介Java编程中的Object类

    这篇文章主要介绍了简介Java编程中的Object类,是Java入门学习中的基础知识,需要的朋友可以参考下 Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每 ...

  3. Java开源项目EZMorph简介

    http://hi.baidu.com/glfbin/blog/item/1302747e8722852e0cd7daaf.html Java开源项目EZMorph简介 2011-04-30 9:40 ...

  4. java apache commons_Apache commons(Java常用工具包)简介

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...

  5. 初学Java多线程:线程简介

     Java多线程初学者指南系列教程http://developer.51cto.com/art/200911/162925.htm 初学Java多线程:线程简介 2009-06-29 17:49 ...

  6. [转载]Java嵌入式开发之一-简介使用Java编写Palm OS程序的解决方案

    Java嵌入式开发之一-简介使用Java编写Palm OS程序的解决方案 现在,使用Java语言为 Palm OS编写程序的领域还没有完全统一,并且也有许多程度上的差异,目前,市面上有好几种不同的可用 ...

  7. Java 观察者模式介绍及示例

    Java 观察者模式介绍及示例 一.观察者模式简介 1.1概念 观察者模式(Observer Pattern) : 观察者模式又名 发布/订阅模式,属于行为模式,定义了对象中一对多的依赖关系,让多个观 ...

  8. android java包_android SDk中常用的java包介绍

    下面是android SDK中API中的主要java包的功能简介: android.app :提供高层的程序模型.提供基本的运行环境 android.content :包含各种的对设备上的数据进行访问 ...

  9. 流行的9个Java框架介绍: 优点、缺点等等

    流行的9个Java框架介绍: 优点.缺点等等 在 2018年,Java仍然是世界上最流行的编程语言.它拥有一个巨大的生态系统,在全世界有超过900万Java开发人员.虽然Java不是最直接的语言,但是 ...

  10. Android下HelloWorld项目的R.java文件介绍

    R.java文件介绍 HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R {     public s ...

最新文章

  1. 熵是什么?熵的公式是什么?决策树如何把熵的递减变换为信息增益进行树枝的分叉以及树的生长的?
  2. bzoj 4010 菜肴制作
  3. 迁移学习领域自适应:具有类间差异的联合概率最大平均差异
  4. git依赖python_python爬虫之git的安装
  5. Poj 1006 / OpenJudge 2977 1006 Biorhythms/生理周期
  6. 计算机开机慢更新配置,电脑开机太慢怎么办?这样设置一下,5秒点亮
  7. Java 基础(十九)代理
  8. log4j日志级别小结
  9. adb命令获取设备IMEI
  10. R软件-ggplot2 画火山图
  11. 什么是HTTPDNS?HTTPDNS有哪些作用?
  12. 微信h5隐藏导航栏和状态栏_导航栏未在SwiftUI中隐藏
  13. 【NLP】一文理解Seq2Seq
  14. 5 6c语言上机作业答案,(完整版)C语言考试题库及答案
  15. 2016年全国计算机一级成绩查询时间,2016年3月计算机一级考试成绩什么时候出来...
  16. 四种检测异常值的常用技术简述
  17. UI设计——网站收藏
  18. 贪玩蓝月服务器维护需多少时间,贪玩蓝月一般多久合区 | 手游网游页游攻略大全...
  19. 修复Windows7引导文件工具(最新mbrfix工具,使用Windows7)
  20. 1.不同进制数之间的相互转换

热门文章

  1. python将图片转为矢量图
  2. JavaScript获取浏览器高度和宽度值
  3. 错误java.lang.NoClassDefFoundError: org/jaxen/VariableContext
  4. Qt怎么实现将bmp图片转换成Ascii_你保存的word和pdf文档图片为什么变模糊了?
  5. 遥感原理与应用网络课程学习
  6. php的get和post,PHP中GET和POST区别
  7. 如何在cad中模块计算机,cad中家具模板哪里找(怎么在CAD图纸里面加入家具)
  8. 文件后缀名查询(全)
  9. 功能测试基础之业务流程测试
  10. 用ERStudio生成带注释的SQL,为每个column生成注释