更多BeanShell内容见此处
我们刚刚讨论的匿名内部类风格的语法(详情见《BeanShell脚本接口之匿名内部类》)允许我们直接创建一个特定接口类型的对象,就像我们在 Java 中使用的那样。但是 BeanShell 比它更加灵活。事实上,在你的 BeanShell 脚本中,任何“this”类型的脚本引用可以自动实现任何需要的接口类型。这意味着你可以简单地对你的脚本或者在任何你要使用的接口类型的脚本对象的地方使用“this”引用。BeanShell 会自动地把它“投”到正确的类型并为你执行方法委托。

比如,我们可以为我们的按钮写一个事件处理的脚本,甚至简单的只是使用一个全局方法,像这样:

 
  
  1. actionPerformed( event ) { 
  2.   print( event ); 
  3. button = new JButton("Foo!"); 
  4. button.addActionListener( this ); 
  5. frame( button ); 

运行效果

点击按钮后


在这里,我们替换了编写脚本对象来持有 actionPerformed() 方法,简单地将方法放置在当前的上下文中(全局范围)并告诉 BeanShell 到那里寻找方法。
正如之前,当 ActionEvents 被按钮触发,你的 actionPerformed() 方法就会被调用。BeanShell 中我们脚本的“this”引用实现接口并对合适的命名方法发出方法调用的指令,如果该命名方法存在的话。

注意:
如果你有兴趣,可以尝试在一个 Shell 或者命令行中交互式地进入之前的例子。你会发现你可以随时通过简单地再一次进入
方法的方式重新定义actionPerformed()。每一个按钮按下以后将会在你的 shell 中找到当前的版本。从某种意义上来讲,
你在一个动态的 Java 对象内部工作,在你打字的时候你创建它并且修改它。巧妙吗?那就是 Bean !
当然你不必全局地定义所有接口的方法。你可以在任何范围内创建引用,就像我们在《BeanShell的脚本对象》和《深入BeanShell脚本对象》中讨论的那样。例如,下面的代码创建了一个脚本化的消息按钮对象,推动它时显示一条消息。该脚本化对象持有自己的 actionPerformed() 方法,还有一个变量持有用于图形用户界面的框架。

 
  
  1. messageButton( message ) { 
  2.   JButton button = new JButton("Press Me"); 
  3.   button.addActionListener( this ); 
  4.   JFrame frame = frame( button ); 
  5.   actionPerformed( e ) { 
  6.     print( message ); 
  7.     frame.setVisible(false); 
  8.   } 
  9. messageButton("Hey you!"); 
  10. messageButton("Another message..."); 

运行效果

单击第一个按钮后


点击另一个按钮后

上面的例子中创建了两个带有各自消息的按钮。每一个按钮在推动时打印他们的消息然后将自己解除。这些按钮通过单独调用 messageButton() 方法被创建,所以各自有他们自己的方法上下文,单独的本地变量以及单独的 ActionListener 接口处理实例。各自(其自己的方法上下文)为其按钮注册 ActionListener,使用各自的“this”引用。

在这个例子中,所有的“动作”被包含在 messageButton() 方法上下文中。作为一个脚本对象实现接口并持有一些状态,用来解除图形用户界面的框架变量。然而更普遍的是,当我们看《BeanShell的脚本对象》和《深入BeanShell脚本对象》章节时,我们已经可以返回“this”引用给调用者,允许它与 messageButton 对象通过其他的方式协同作用。