更多详情请见此处

使用 BeanShell 的许多朋友使用它来编写与已经存在的 Java 类或者 API 作业的脚本,或者为了他们自己的应用在运行时在没有其他编译器的帮助下执行其他种类动态的活动。通常这意味着编写相对非结构化的代码——比如,包含在一个 单独的脚本文件或者 eval() 语句里的一系列方法调用或者循环。在之前的章节中我们看到 BeanShell 也具有脚本方法的能力,就像 Java 一样。创建方法以及新的 BeanShell 命令(仅仅是他们自己文件中的方法)是组织你的脚本成为可重用、可维护组件的自然进程。

方 法和结构化的程序设计当然在于对象以及面向对象编程完整的程度。在 Java 中对象是类的产物。虽然 BeanShell 和标准的 Java 语法是兼容的,包括语句、表达式以及方法,但你仍然不能在 BeanShell 中编写新的 Java 类的脚本。但是,BeanShell 允许你编写像“闭合方法”的脚本对象,类似在 Perl 5.x、JavaScript 还有其他对象——可以写脚本的语言中的做法。这类脚本对象(我们马上就会描述)的风格简单而且从脚本方法的风格自然流传下来。你马上会看到这种语法,是标 准 Java 使用“this”引用指向一个对象的概念的直接扩展。

  1. 注意:
  2. 在标准 Java 中,一个方法在一个对象(一个实例化的方法)里可以使用专门的变量“this”指向这个封闭
  3. 的对象。
  4. // MyClass.java
  5. MyClass {
  6. Object getObject() {
  7. return this; // 返回对象的一个引用
  8. }
  9. }
  10. 在上面的例子里,MyClass 的 getObject() 方法返回自己对象实例(MyClass 对象的实例)的一个引用。

“this”引用
跟多数的语言一样,BeanShell 里的一个执行的方法有它自己持有参数(传值参数)变量和本地声明变量的“本地化”范围。在下面的代码段中,在 foo() 方法中我们会使用到的任何变量通常只在 foo() 当中以及一个特定的 foo() 方法调用的生存期内可见。
示例代码

  1. // 定义 foo() 方法:
  2. foo() {
  3. int bar = 42;
  4. print( bar );
  5. }
  6. // 调用 foo() 方法:
  7. foo(); // 打印 42
  8. print( bar ); // Error, bar 在此未定义

运行效果

在上面的例子中,变量"bar"属于方法foo(),因此在方法调用的外面是不可用的——方法退出时变量就会被处理掉,如标准的 Java 本地变量一样。

现在转换一个视角——在 BeanShell 里你可以选择通过专门的“this”引用在一个方法调用退出之后对该作用域“抓住不放”。就像在 Java 中一样,“this”指向当前对象的上下文。唯一不同过的地方就是在这种情况下该上下文只与该方法有关联,却不是一个类的实例。

在方法返回之后保存“this”引用,使用标准 Java 记号“.”你可以继续指向在该方法中定义的变量:

  1. foo() {
  2. int bar = 42;
  3. return this;
  4. }
  5. fooObject = foo();
  6. print( fooObject.bar ); // 打印 42!

运行效果

在上面的例子中,foo() 方法返回值(“this”引用)可以看做是一个“foo”对象的实例。每一次 foo() 方法调用会创建一个新的对象;foo() 此时不仅仅是一个方法,还是对象构造的一种形式。

上面案例中的 foo 对象甚至可以说不是一个对象,说是一个构造器更合适。它包含变量(bar)但没有“行为”。
下一个视角,我们会介绍 BeanShell 方法也允许包含其他方法:

  1. foo() {
  2. bar() {
  3. ...
  4. }
  5. }

脚本方法可以通过这种方式定义任意数量的嵌套方法,可以是任意深度的。这些方法是方法的“本地”调用。

BeanShell 方法闭合范围内的语句和表达式可以叫做“本地”方法,就像任何其他方法一样。(局部地定义的方法覆盖外部的——在 Java 里多数方法像本地变量那样隐藏了实例变量。)闭合的方法并不直接在闭合方法外部可见。然而,正如你希望的那样,你可以像对 Java 对象那样通过一个适当的对象引用来调用它们:

  1. foo() {
  2. int a = 42;
  3. bar() {
  4. print("The bar is open!");
  5. }
  6. bar();
  7. return this;
  8. }
  9. // 构造 foo 对象
  10. fooObject = foo(); // 打印 "the bar is open!"
  11. // 打印 foo 对象的一个变量
  12. print ( fooObject.a ); // 42
  13. // 使用 foo 对象调用一个方法
  14. fooObject.bar(); // 打印 "the bar is open!"

运行效果

在方法里的方法声明在块状的结构中,表现得就像它们直接被声明在该方法里一样。换言之,没有本地块方法。
示例代码

  1. foo() {
  2. bar() { }
  3. if ( true ) {
  4. bar2() { }
  5. }
  6. return this;
  7. }

在上面的例子中,方法 bar() 和 bar2() 都被定义在 foo() 里面。

下一章节我们回到变量作用域的话题中来,并更加深入地探讨如何使用脚本方法和对象。

转载于:https://blog.51cto.com/tongqiuyan/757750

深入BeanShell脚本对象相关推荐

  1. jmeter(四十五)常用Beanshell脚本

    整理了一批jmeter常用的beanshell脚本供大家参考! 时间戳 import java.text.SimpleDateFormat; import java.util.Calendar; im ...

  2. 你需要的jmeter常用Beanshell脚本,还不看一眼?

    前言:这篇文章主要向大家介绍jmeter经常使用的Beanshell脚本,主要内容包括基础应用.实用技巧.原理机制等方面,希望对大家有所帮助. 1.利用jmeter自带函数获取系统当前时间 //当前时 ...

  3. U3D 场景切换时 脚本对象,GO对象,资源对象的问题

    U3D 场景切换时 脚本对象,GO对象,资源对象的问题 脚本对象:在LUA中写了一个actor类,它封装了角色逻辑,引用了一个GO. GO对象:通过 GameObject.Instantiate(资源 ...

  4. jmeter beanshell脚本使用

    全局变量设置与调用 1.__setProperty 功能:该函数用来给JMeter属性设置值,默认返回值为空字符串,所以函数在任何地方被调用都是有效的. 作用域:跨线程组调用,可以在任意地方调用,但不 ...

  5. BeanShell脚本接口之匿名类

    更多BeanShell内容请点击此处 BeanShell 最强大的功能之一就是具有编写 Java 接口脚本的能力.这个功能允许你编写脚本用作事件处理.监听以及其他 Java API 的组件.它也可以从 ...

  6. Jmeter 在 beanshell 脚本中写日志

    JMETER 在执行时,会写日志数据,我们在编写脚本的时候也可以自己写日志. 日志记录再jmeter 的bin 目录的 jmeter.log 文件中. jmeter 比较人性化,它在这里提供了脚本可以 ...

  7. 弱引用的用途:在底层C++对象被上层python脚本对象使用时(转)

    在使用python脚本和底层C++对象进行交互的过程中发生了一个问题:由于底层C++对象的创建和删除决定权由底层决定,当底层决定删除这些对象而上层仍然在"强引用"这些对象的时候,就 ...

  8. unity关于对其他脚本对象的修改

    重点放在前面 假定要在此脚本下修改另外一个脚本的对象 如果需要修改的对象是引用类型,可以直接在此脚本下声明同类型对象,并将需要修改的对象赋值然后直接修改 如果需要修改的对象是值类型,需要通过类访问它才 ...

  9. War3 脚本对象句柄管理

    前言 War3设计的时候可能没有想到如今的RPG地图的火爆,作为一款RTS游戏来说当初的设计也不会考虑到地图上单位过多的问题(游戏机制有人口限制).因为在脚本引擎对句柄回收机制这块并没有那么先进(自动 ...

最新文章

  1. 三分钟了解“Java重写”
  2. PAT 乙级 1041 考试座位号
  3. Shell脚本[运算表达式,条件控制语句]
  4. 2.5e2.0是合法的c语言常量,二级考试C语言程序设计.ppt
  5. Hadoop学习之MapReduce(二)
  6. 如何搭建一个 MySQL 分布式集群
  7. mysql 创建外键实例_mysql 外键创建实例
  8. Java黑皮书课后题第8章:**8.4(计算每个雇员每周工作的小时数)假定所有雇员每周工作的小时数存储在一个二维数组中。1行包含7列,记录了一个雇员7天的工作小时数。编写一个程序,按照总工时降序显示
  9. Activity 在横竖屏切换情况下的生命周期变化
  10. MAC OS X 1.1 El Capitan安装方法与步骤
  11. ro手游服务器维护公告,4月10日5点-10点停服维护公告
  12. php+go+to,让phpstrom支持codeigniter框架实现 (GO TO )转到定义的功能
  13. Oracle数据库中文乱码问题解决
  14. 使用H5编写网页版象棋(源码)
  15. C++ 逆波兰表达式
  16. 计算机网络安全漏洞排查报告,网络安全漏洞自查报告.docx
  17. snkrs抽签协议获取
  18. python代码变成so
  19. 学生网页作业—山河旅行社网站(5页) HTML+CSS+JavaScript 学生DW网页 出行 旅途 游玩
  20. 2023年全国最新会计专业技术资格精选真题及答案18

热门文章

  1. java levenshtein算法_DNA分析 拼字检查 语音辨识 抄袭侦测 - Levenshtein算法
  2. 采用批处理命令对文件进行解压及采用SQLCMD进行数据库挂载
  3. 代码中findOne方法找不到
  4. 无心剑古体诗《永恒之美》
  5. SSM框架笔记07:初探Spring——采用XML配置文件与注解方式
  6. 【BZOJ1483】【codevs2335】【hdu5997】梦幻布丁+加强版,LCA+主席树
  7. 向量的 加,减,乘 运算_2
  8. bzoj4415 [Shoi2013]发牌 线段树
  9. 2017.9.10 土地购买 思考记录
  10. 2017.9.9 堵塞的交通 思考记录