深入BeanShell脚本对象-阿里云开发者社区

开发者社区> 科技小能手> 正文

深入BeanShell脚本对象

简介:
+关注继续查看

更多详情请见此处

使用 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.  
  5. // MyClass.java 
  6. MyClass { 
  7. Object getObject() { 
  8. return this; // 返回对象的一个引用 
  9.  
  10. 在上面的例子里,MyClass 的 getObject() 方法返回自己对象实例(MyClass 对象的实例)的一个引用。 

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


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

运行效果

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

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

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


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

运行效果

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

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


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

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

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


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

运行效果


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


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

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

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



本文转自 tongqiuyan  51CTO博客,原文链接:http://blog.51cto.com/tongqiuyan/757750


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用lombok编写优雅的Bean对象
使用java编写代码,十之八九都是在写java类,从而构建java对象。lombok之前也说了不少,但使用了这么多年,感觉还是有很多技巧可以使用的。 毫无疑问,使用lombok,编写的java代码很优雅,而使用起来和普通的java编码方式创建的类毫无二致。
1247 0
VBS 脚本对象
Dictionary对象(1) 1.        属性: a)        compareMode b)       count c)        key d)       item 2.
638 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4483 0
Spring IOC 容器源码分析 - 创建原始 bean 对象
1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续。在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程。本篇文章,我们就从战术的层面上,详细分析doCreateBean方法中的一个重要的调用,即createBeanInstance方法。
1483 0
AngularJs中,如何在render完成之后,执行Js脚本
AngularJs是Google开源的前端JS框架。使用AngularJs, 我们能够容易地、健壮的开发出类似于Gmail一样的单页Web应用。AngularJs这个新兴的MVC前端框架,具有以下特点: MVC, 模块化,自动化双向数据绑定,语义化标签、依赖注入等。
721 0
性能测试脚本的编写和调试
性能测试是一个入门简单,但是精通难,很依赖实践经验的技术活。如何编写压测脚本只是小术,而如何快速找到问题的原因,压出瓶颈却是大有学问。这次,云享团的专家从“术”入手,对一个自己临时写的的一个网站进行压测,希望能帮大家更好理解性能测试产品,特别是脚本编写的部分。
7330 0
小猿日记(15) - 脚本订正注意事项
小猿日记(15) - 脚本订正注意事项
157 0
Linux Shell脚本读写XML文件
在Linux下如何用Shell脚本读写XML?现有一个config.xml    192.168.1.45   1209   /home/john 需要修改里面的"server-ip", "server-port" and "import-path",用Shell脚本的参数$1,$2,$3来写入。
1665 0
14426
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载