beanshell入门:脚本中引用自定义的变量和方法和定义运行时变量
Beanshell (bsh) 是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性。
BeanShell执行 标准Java语句和表达式,另外包括一些脚本命令和语法。它将脚本化对象看作简单闭包方法(simple method closure)来支持,就如同在Perl和JavaScript中的一样。 它具有以下的一些特点:使用Java反射API以提供Java语句和表达式 的实时解释执行;可以透明地访问任何Java对象和API;可以在命令行模式、控制台模式、小程序模式和远程线程服务器模式等四种模式下面运行;与在应用 程序中一样,可以在小程序中(Applet)正常运行(无需编译器或者类装载器) @百度百科
简单的来说,Beanshell提供了一种将Java代码作为脚本动态执行能力。关于Beanshell的简介网上可以找到很多文章,本文不再复述,本文主要说明在如何在脚本中引用自定义的变量和方法和定义运行时变量
引用对象的方法和变量
如下我们定义了一个类,实现了runScript方法执行指定的脚本,并实现了一个叫isEmpty的方法判断一个对象是否为空, 我们希望能执行runScript方法执行Beanshell脚本时,在Beanshell脚本中能调用isEmpty方法.
public class TestClass{
/** bsh解释器实例 */
private Interpreter interpreter = new Interpreter();
/**
* BeanShell运行环境调用的方法:判断一个对象是否为null或空,参见{@link BeanPropertyUtils#isEmpty(Object)}
* @param value
*/
public boolean isEmpty(Object value) {
if(null == value){
return true;
}else if(value instanceof String){
return ((String)value).isEmpty();
}else if (value instanceof Collection) {
return ((Collection)value).isEmpty();
}else if (value instanceof Iterator) {
return !((Iterator)value).hasNext();
}else if (value instanceof Iterable) {
return !((Iterable)value).iterator().hasNext();
}else if (value instanceof Map) {
return ((Map)value).isEmpty();
}else if (value.getClass().isArray()) {
return Array.getLength(value)==0;
}
return false;
}
/**
* 执行指定的脚本
*/
public void runScript(String script){
interpreter.eval(script);
}
}
Interpreter
的 getNameSpace
方法返回的NameSpace
对象的importObject
方法可以将指定对象的public方法和变量引入Beanshell脚本的运行时的名字空间,这样Beanshell脚本就可以引用导入的方法了,所以我们可以如下增加构造方法
TestClass(){
// 将当前对象添加到namespace,这样脚本中才可以访问对象中的方法,isEmpty
interpreter.getNameSpace().importObject(this);
}
有了上面的引入方法,就可以如下执行脚本
TestClass bsh = new TestClass();
Object value = "hello,world";
bsh.runScript("if(!isEmpty(\"+ value +\"))print(\"no empty\");")
定义Beanshell脚本的运行时变量
Interpreter
的set
方法用于为Beanshell运行空间定义指定变量名的变量,示例如下:
/**
* 定义脚本执行变量,在{@link #with(Object)}方法之后调用有效
* @param varname 变量名,为空或{@code null}忽略
* @param value 变量的值
* @return 当前对象
*/
public TestClass defineVariable(String varname,Object value) {
if(!isNullOrEmpty(varname)){
try {
interpreter.set(varname, value);
SimpleLog.log(debuglog,"{} = {}",varname,value);
} catch (EvalError e) {
throw new RuntimeException(e);
}
}
return this;
}
有了上面的变量定义方法,就可以如下执行脚本
TestClass bsh = new TestClass();
bsh.defineVariable("value",new ArrayList());
bsh.runScript("if(!isEmpty(value))print(\"no empty\");")
相关文章
- iOS小技能:动态地给类添加新的方法、实例变量、属性。
- java 取系统当前时间_java获取当前系统时间方法
- Centos误删自带python2.7恢复方法
- win10更新后分辨率不可设置、只能设置低分辨率问题排查和解决方法
- 织梦DEDECMS添加新变量和删除新变量的方法详解
- 总结了ChatGPT-4的国内使用方法以及注册教程
- WordPress 4.3 产生大量定时作业修复方法
- 微信小程序显示html代码的方法详解手机开发
- 灵活操纵Oracle字符串变量的方法(oracle字符串变量)
- Mysql中定义变量的方法:SET @变量名=值(mysql如何定义变量)
- JS removeEventListener()和detachEvent()方法:销毁事件
- 查询Oracle中所有表的方法(oracle如何查询所有表)
- 提升Linux文件压缩比例的方法(linux压缩比例)
- MySQL中处理二进制数据的方法(mysql二进制数据)
- MySQL处理二进制数据的方法(mysql二进制数据)
- MySQL变量的使用方法详解(mysql变量使用)
- 研究MSSQL参数和变量的使用方法(mssql的参数和变量)
- 信息Linux下查看系统信息的简易方法(linux下查看系统)
- MySQL中C语言实现动态绑定变量的方法(c mysql 绑定变量)
- MySQL数据库中的关联删除无法执行方法和解决方案(mysql不能关联删除)
- MySQL数据库不支持中文变量解决方法浅析(mysql不支持中文变量)
- Oracle中查询表大小的简易方法(oracle中查表的大小)
- PHP获取类中常量,属性,及方法列表的方法
- php中比较简单的导入phpmyadmin生成的sql文件的方法
- PHP类的静态(static)方法和静态(static)变量使用介绍
- SQLServer遍历表中记录的2种方法(使用表变量和游标)
- 基于jquery实现拆分姓名的方法(纯JS版)
- 解析Linux下的时间函数:设置以及获取时间的方法
- PHPSession变量的使用方法详解与实例代码
- python基础教程之简单入门说明(变量和控制语言使用方法)
- C#窗体编程(windowsforms)禁止窗口最大化的方法
- PHP图片库imagemagick安装方法