前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >beanshell入门:脚本中引用自定义的变量和方法和定义运行时变量

beanshell入门:脚本中引用自定义的变量和方法和定义运行时变量

作者头像
10km
发布2022-09-26 16:12:51
1.6K0
发布2022-09-26 16:12:51
举报
文章被收录于专栏:10km的专栏10km的专栏10km的专栏

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

InterpretergetNameSpace 方法返回的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脚本的运行时变量

Interpreterset方法用于为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\");")
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引用对象的方法和变量
  • 定义Beanshell脚本的运行时变量
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档